繁体   English   中英

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

[英]In C, how to malloc and free a SOCKET (already a pointer)

SOCKET来自winsock.h

声明为

SOCKET BillerSocket;

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

我用它malloc

BillerSocket = malloc(sizeof(SOCKET));

我得到这个警告

[警告]分配使指针从整数变为无强制转换[默认启用]

当我free了SOCKET

free(BillerSocket);

我收到警告和注释,似乎可以告诉我该怎么办。

[警告]传递参数1到'free'使指针从整数开始而没有强制转换[默认启用]

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数据类型

UINT_PTR
一个未签名的INT_PTR。

在BaseTsd.h中声明此类型,如下所示:

 #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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM