use*_*770 4 int gcc void-pointers gcc-warning
我正在进行套接字编程..我的代码以我想要的方式执行,我可以使用它.但它给了我一个关于编译的警告.
我编译使用
gcc server1.c -o server1 -lpthread
Run Code Online (Sandbox Code Playgroud)
我得到了警告
warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
Run Code Online (Sandbox Code Playgroud)
以下代码出现此错误
int newsockfd;
newsockfd = (int)newsockfdd; //this line
Run Code Online (Sandbox Code Playgroud)
我在下面的代码块中使用了newsockfdd(这是int)
if (pthread_create(&threadID[i++], NULL, serverThread, (void *)(intptr_t)newsockfdd) != 0)
{
perror("Thread create error");
}
Run Code Online (Sandbox Code Playgroud)
你可能会说,代码编写得不是很好(我正在努力使其更好).我知道这个警告是因为与int的大小有关.但我真的不知道如何解决它.在我在pthread_create语句中输入(intptr_t)之前,它在该行上显示警告,但那时警告是
warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
Run Code Online (Sandbox Code Playgroud)
似乎应该有一个简单的解决方案吗?但我找不到它.我正在使用Ubuntu 64位.这是警告的原因吗?
正如在评论中已经确定的那样,情况是(模数重命名以避免混淆newsockfdd作为传递参数或接收参数的出现)
void *serverThread(void *arg) {
// ...
int newsockfd = (int)arg;
// ...
}
Run Code Online (Sandbox Code Playgroud)
和main(或从那里调用的函数)
// ...
int newsockfdd = whatever;
// ...
if (pthread_create(&threadID[i++], NULL, serverThread, (void *)(intptr_t)newsockfdd) != 0)
// ..
Run Code Online (Sandbox Code Playgroud)
因此当int newsockfdd作为参数传递时serverThread,它会被转换为a 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往返(尽管标准中的脚注说
用于将指针转换为整数或整数到指针的映射函数旨在与执行环境的寻址结构一致.
所以它可能会在这种情况下往返并按预期工作 - 但是如果a的大小void*小于整数类型的大小,它可能不会[仅对于足够小的绝对值的值] [考虑long long -> void* -> long long在32位上考虑系统]).
正确的解决方法是避免整数和指针之间的转换,
void *serverThread(void *arg) {
// ... check that arg isn't NULL
int newsockfd = *(int *)arg;
// ...
}
Run Code Online (Sandbox Code Playgroud)
in severThread,将接收到的指针强制转换为适当类型的指针,并读取指向的值,然后输入main
if// ...
int newsockfdd = whatever;
// ...
if (pthread_create(&threadID[i++], NULL, serverThread, &newsockfdd) != 0)
Run Code Online (Sandbox Code Playgroud)
传递地址newsockfdd.
一个警告:如果serverThread从多个地方调用,则需要修复所有这些地方的呼叫.
| 归档时间: |
|
| 查看次数: |
18660 次 |
| 最近记录: |