我正在研究套接字编程..我的代码按照我想要的方式执行,我可以使用它。但它给了我编译警告。
我使用编译
gcc server1.c -o server1 -lpthread
我收到警告
warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
以下代码出现此错误
int newsockfd;
newsockfd = (int)newsockfdd; //this line
我在下面的代码块中使用 newsockfdd (这是 int)
if (pthread_create(&threadID[i++], NULL, serverThread, (void *)(intptr_t)newsockfdd) != 0)
{
perror("Thread create error");
}
正如您可能知道的那样,代码写得不太好(我正在努力使其变得更好)。我知道这个警告是因为与 int 的大小有关。但我真的不知道如何解决它。在我在 pthread_create 语句中放入 (intptr_t) 之前,它在该行上显示了一个警告,但当时警告是
warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
似乎应该有一个简单的解决方案?但我找不到它。我使用的是 Ubuntu 64 位。这是警告的原因吗?
最佳答案
正如评论中所确定的,情况是(模重命名以避免混淆 newsockfdd
作为传递参数或接收参数的出现)
void *serverThread(void *arg) {
// ...
int newsockfd = (int)arg;
// ...
}
和main
(或从那里调用的函数)
// ...
int newsockfdd = whatever;
// ...
if (pthread_create(&threadID[i++], NULL, serverThread, (void *)(intptr_t)newsockfdd) != 0)
// ..
因此,当 int newsockfdd
作为参数传递给 serverThread
时,它会被转换为 void*
。最初,该转换是直接的,但插入了对 intptr_t
的中间转换,以消除有关从不同大小的整数转换为指针
的警告。
并且在serverThread
中,接收到的void*
被强制转换为int
,从而导致关于从指针强制转换为不同大小的整数
。
该警告也可以通过向 intptr_t
插入中间转换来删除。
但是,虽然标准允许将整数转换为指针,反之亦然,但结果是实现定义的,并且不能保证 int -> void* -> int
往返(尽管,标准中的脚注说
The mapping functions for converting a pointer to an integer or an integer to a pointer are intended to be consistent with the addressing structure of the execution environment.
所以可能在这种情况下它会往返并按预期工作 - 但如果 void 的大小,它可能不起作用[仅适用于绝对值足够小的值] *
小于整数类型[考虑 32 位系统上的 long long -> void* -> long long
])。
正确的解决方法是避免整数和指针之间的转换,
void *serverThread(void *arg) {
// ... check that arg isn't NULL
int newsockfd = *(int *)arg;
// ...
}
在severThread
中,将接收到的指针转换为适当类型的指针,并读取指向的值,并在main
中
if// ...
int newsockfdd = whatever;
// ...
if (pthread_create(&threadID[i++], NULL, serverThread, &newsockfdd) != 0)
传递newsockfdd
的地址。
需要注意的是:如果从多个位置调用 serverThread
,则需要修复所有这些位置的调用。
关于gcc - 警告 : cast from pointer to integer of different size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547920/