警告:从指针强制转换为不同大小的整数

时间:2012-11-25 03:08:44

标签: 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位。这是警告的原因吗?

1 个答案:

答案 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,则需要修复所有这些地方的呼叫。