gpt4 book ai didi

c - 警告 : cast to pointer from integer of different size [-Wint-to-pointer-cast]

转载 作者:太空狗 更新时间:2023-10-29 15:59:25 24 4
gpt4 key购买 nike

我的部分代码:

int server_sockfd, client_sockfd; //socket file descriptors of client and server

// ... some code

if(pthread_create(&vlakno, NULL, handle_client, (int *) client_sockfd) != 0) {
perror("Error while creating thread.");
}

我收到“警告:从不同大小的整数 [-Wint-to-pointer-cast] 转换为指针”

我的函数原型(prototype):

void *handle_client(void *args);

我发现了这个问题:
link

第一个回答说他应该使用 intptr_t 而不是 int。
我有两个问题:
在我的例子中,int 和 intptr_t 有什么区别?
我该怎么办?

我有两个想法:
第一:(改变文件描述符的类型)

 int server_sockfd, client_sockfd; //socket file descriptors of client and server

// ... some code

if(pthread_create(&vlakno, NULL, handle_client, (intptr_t *) client_sockfd) != 0) {
perror("Error while creating thread.");
}

或第二个想法:(仅在转换函数 pthread_create 中更改类型)

intptr_t server_sockfd, client_sockfd; //socket file descriptors of client and server

// ... some code

if(pthread_create(&vlakno, NULL, handle_client, (int *) client_sockfd) != 0) {
perror("Error while creating thread.");
}

编辑:
在函数 handle_client 中我想这样做:

int clientSocket;
clientSocket = (int)args;

我真的很抱歉用户cnicar或类似的东西..不幸的是他删除了他的答案但没关系。
他的解决方案是使用 (void *),它首先抛出了同样的错误,但它可能是由 eclipse 的不良行为引起的:(所以给他留言:
好的,谢谢它现在看起来很好...... Eclipse 仍然抛出这个警告但是当我打开和关闭它两次后用你的编辑编辑它:)非常感谢

最佳答案

您已将 client_sockfd 声明为 int。您不应该那样将其转换为 int *

使用 & 操作符,获取 client_sockfd 的地址,如果你想给 client_sockfd< 一个指针/:

pthread_create(&vlakno, NULL, handle_client, &client_sockfd)
// ^ & operator

一定要注意 client_sockfd 的生命周期,它必须比线程长,以防止竞争条件(见评论)。


intintptr_t 的区别是int 是用来存放一个整数,而intptr_t 是意味着以整数形式保存地址。 intptr_t 保证能够保存指针,而 int 则不能。

如果您的目的是传递client_sockfd,将其转换为intptr_t:

pthread_create(&vlakno, NULL, handle_client, (intptr_t)client_sockfd)

关于c - 警告 : cast to pointer from integer of different size [-Wint-to-pointer-cast],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9251102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com