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

时间:2012-02-12 17:49:27

标签: c sockets pointers client-server

我的部分代码:

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仍然抛出这个警告,但是当我打开和关闭它两次之后再编辑就好了你的编辑:)非常感谢

3 个答案:

答案 0 :(得分:5)

您已将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)

答案 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最后一个参数。