gcc - 警告 : cast from pointer to integer of different size

标签 gcc int void-pointers gcc-warning

我正在研究套接字编程..我的代码按照我想要的方式执行,我可以使用它。但它给了我编译警告。

我使用编译

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/

相关文章:

C - 将 void* 转换为 int 内核的最佳实践

iphone - NSString 到 NSNumber

c++ - g++ 找不到共享库

linux - 将静态库链接到共享库时是否应该隐藏符号?

c - 海湾合作委员会错误 : expected expression before 'else'

cocoa - 在 Cocoa 中设置权限

c++ - 如何从 double(*)(void) 转换为具有给定参数数量的函数指针?

c - 调用realloc后是否需要初始化(设置为0)内存?

c++ - 为什么不能 static_cast 双空指针?

编译器不显示任何错误或警告,但程序不工作