c - 在 C 中,如何 malloc 和释放一个 SOCKET(已经是一个指针)

标签 c sockets winapi winsock

SOCKET 来自 winsock.h

声明为

SOCKET BillerSocket;

据我所知,SOCKET 已经是一个伪装的指针,所以我不应该做 free(*BillerSocket);

我用malloc

BillerSocket = malloc(sizeof(SOCKET));

我收到这个警告

[警告] 赋值从指针生成整数而不进行强制转换 [默认启用]

当我释放一个SOCKET时

free(BillerSocket);

我收到警告和注释,似乎告诉我必须做什么。

[警告] 传递 'free' 的参数 1 使指针来自没有转换的整数 [默认启用]

129 0   c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\combaseapi.h    In file included from c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\combaseapi.h
14      c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\objbase.h                    from c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\objbase.h
17      c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\ole2.h                   from c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\ole2.h
12      c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\wtypes.h                     from c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\wtypes.h
10      c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\winscard.h                   from c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\winscard.h
97      c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\windows.h                    from c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\windows.h
1       main.c       
            from main.c
438 16  c:\program files\dev-cpp\mingw64\x86_64-w64-mingw32\include\stdlib.h

[注意] 应为 'void *' 但参数类型为 'SOCKET'

如何删除警告?

最佳答案

如果您更仔细地查看 winsock.h,您会发现 SOCKET 不是指针,而是一个整数:

typedef UINT_PTR SOCKET;

UINT_PTR 不是指向 UINT 的指针(PUINTLPUINT 是)。它是一个与指针大小相同的UINT。所以UINT_PTR在32位进程中是4字节,在64位进程中是8字节。有关详细信息,请参阅 MSDN 的文档:

Windows Data Types

UINT_PTR
An unsigned INT_PTR.

This type is declared in BaseTsd.h as follows:

#if defined(_WIN64)
 typedef unsigned __int64 UINT_PTR;
#else
 typedef unsigned int UINT_PTR;
#endif

您不使用malloc()free() 来管理SOCKET 值,您必须使用socket() closesocket() 代替:

SOCKET BillerSocket;
...
BillerSocket = socket(...);
...
closesocket(BillerSocket);

关于c - 在 C 中,如何 malloc 和释放一个 SOCKET(已经是一个指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27081315/

相关文章:

c - 了解一些汇编代码

delphi - 在托盘中显示的最佳图标尺寸

java套接字 - 测量发送和响应所需的时间

java - 聊天客户端发生奇怪的线程

winapi - 如何检测在另一个工作站上运行的同一个 Win32 应用程序的另一个实例?

c++ - 如何启动具有特定访问权限的子进程

c++ - 在没有条件的情况下将一个 unsigned char 的一位设置为另一个 unsigned char 的另一位

c - 为什么这个循环在第一次转换后会产生错误?

c - 初始化二维数组时出现段错误

java - 想要在 openshift 上托管 JAVA 中的原始套接字程序