我正在进行套接字编程..我的代码以我想要的方式执行,我可以使用它。但是它给了我关于编译的警告。
我使用
进行编译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位。这是警告的原因吗?
答案 0 :(得分:6)
正如评论中所确定的那样,情况是(以模数重命名以避免将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
的中间演员,以删除有关cast to pointer from integer of different size
的警告。
在serverThread
中,收到的void*
会投放到int
,从而产生关于cast from pointer to integer of different size
的警告。
也可以通过向intptr_t
插入一个中间演员来删除该警告。
但是,虽然标准允许将整数转换为指针而反之亦然,但结果是实现定义的,并且无法保证int -> void* -> int
往返(尽管标准中的脚注说明
用于将指向整数或整数的指针转换为指针的映射函数 与执行环境的寻址结构保持一致。
所以可能它将在这种情况下往返并按预期工作 - 但如果{{1}的大小,它可能不会[仅适用于绝对值足够小的值] }小于整数类型[在32位系统上考虑void*
]。)。
正确的解决方法是避免在整数和指针之间进行转换,
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
,则需要修复所有这些地方的呼叫。