【问题标题】:In C, how to malloc and free a SOCKET (already a pointer)在 C 中,如何 malloc 和释放 SOCKET(已经是指针)
【发布时间】:2014-11-22 19:06:23
【问题描述】:

SOCKET 来自winsock.h

声明为

SOCKET BillerSocket;

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

malloc它与

BillerSocket = malloc(sizeof(SOCKET));

我收到此警告

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

当我free一个 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”类型

如何删除警告?

【问题讨论】:

  • 你不用malloc和free,你用socket()closesocket()
  • 另外,SOCKET 不是指针。
  • 哦,谢谢,我从来没有使用过 C/C++ 只是来使用它,我想清除警告,感谢提示,我将删除 mallocfree。如果你愿意,你可以写一个答案,我会接受,或者我可以删除问题,但它可能会帮助一些人。

标签: c sockets winapi winsock


【解决方案1】:

如果你仔细观察winsock.h,你会发现SOCKET不是一个指针,它是一个整数:

typedef UINT_PTR SOCKET;

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

Windows Data Types

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

【讨论】:

  • SOCKET 是什么类型甚至都没有关系。它对应用程序是不透明的。
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 2020-08-08
  • 1970-01-01
  • 2016-05-08
  • 2023-03-11
  • 1970-01-01
  • 2023-03-25
  • 2017-02-25
相关资源
最近更新 更多