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
的指针(PUINT
和 LPUINT
是)。它是一个与指针大小相同的UINT
。所以UINT_PTR
在32位进程中是4字节,在64位进程中是8字节。有关详细信息,请参阅 MSDN 的文档:
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/