我的部分代码:
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]”
我的功能原型:
void *handle_client(void *args);
我发现了这个问题:
link
第一个答案说他应该使用intptr_t而不是int
我有两个问题:
在我的情况下int和intptr_t有什么区别?
我该怎么办?
我有两个想法:
1st :(更改文件描述符的类型)
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仍然抛出这个警告,但是当我打开和关闭它两次之后再编辑就好了你的编辑:)非常感谢
答案 0 :(得分:5)
您已将client_sockfd
声明为int
。你不应该以那种方式将其强制转换为int *
。
使用&
运算符来获取client_sockfd
的地址,如果您打算将指针提供给client_sockfd
:
pthread_create(&vlakno, NULL, handle_client, &client_sockfd)
// ^ & operator
请注意client_sockfd
的生命周期,它必须比线程更长,以防止竞争条件(参见评论)。
int
和intptr_t
之间的区别在于int
意味着保留一个整数,而intptr_t
意味着保存一个整数形式的地址。保证intptr_t
能够保持指针,而int
不是。
如果您打算传递client_sockfd
的值,请将其投放到intptr_t
:
pthread_create(&vlakno, NULL, handle_client, (intptr_t)client_sockfd)
答案 1 :(得分:2)
(int *) client_sockfd
client_sockfd
不是指针。它是int
,与int *
的大小不同。并告诉你。
pthread_create()
的最后一个参数是void *
,它是指向要传递到该特定线程的数据的指针。您似乎正在尝试将client_sockfd
的整数值转换为指针并传递该指针。这通常不是你要做的事情,但是如果你真的想要并避免警告那么你需要使用与指针大小相同的东西,这就是intptr_t
给你的东西。很可能int
是4个字节,intptr_t
(和void *
)是系统上的8个字节,但这取决于平台。虽然您可以安全地使用32-> 64-> 32位,但编译器会警告您具有不同的大小。
答案 2 :(得分:0)
(int *) client_sockfd
不等同于&client_sockfd
。
第一个将client_sockfd
的值转换为int *
,第二个表单生成指向client_sockfd
的指针。
后面的表达式必须用于pthread_create
最后一个参数。