我有
client_sock = accept(server_sock, (struct sockaddr *)&client_name, &client_name_len);
if (pthread_create(&newthread , NULL, (void * ) accept_request, client_sock) != 0) {
perror("pthread_create");
}
这只是整个脚本的一部分。每当我尝试编译它时,我都会得到warning: passing argument 4 of 'pthread_create' makes pointer from integer without a cast
知道为什么会这样吗?提前谢谢。
答案 0 :(得分:5)
参数4是client_sock
,这是传递给accept_request
的参数。它应该是一个指针,但由于它只是传递给你的函数,它可以是一个整数而不会造成任何伤害。只需将其转换为void*
即可删除警告。
另一方面,第三个参数accept_request
应该是一个接受void*
并返回void*
的函数指针。您不应该将其强制转换为void*
。最好将accept_request
的声明更改为符合规范。
void *accept_request( void *client_sock );
答案 1 :(得分:3)
我假设client_sock被定义为“int client_sock”。在这种情况下,您应该写下以下内容:
if (pthread_create(&newthread , NULL, (void * ) accept_request, &client_sock) != 0) {
然后在accept_request(其中,顺便说一下,应该是一个带指针的函数),你会这样做:
void *accept_request( void *client_sock_addr ) {
int client_sock = *((int*) client_sock_addr);
}
将int转换为(void *)可能不可移植(因为int和void *的数据大小不一定相同)。当然,它可能适用于您当前的编译器......
感谢jiles指出这一点:根据代码的其余部分,该地址的值可能会发生变化(例如,如果在accept构造周围有一个循环,并且在创建一个线程之前有2个接受到达)。最好的方法是使用malloc分配内存,如
int *client_sock_addr=malloc(sizeof(int));
*client_sock_addr = accept(server_sock, (struct sockaddr *)&client_name, &client_name_len);
if (pthread_create(&newthread , NULL, (void * ) accept_request, client_sock_addr) != 0) {
perror("pthread_create");
}
然后在函数中执行:
void *accept_request( void *param ) {
int *client_sock_addr = (int*) client_sock_addr;
int client_sock = *client_sock_addr;
// Before exiting the thread
free(client_sock_addr);
}
答案 2 :(得分:0)
这只是因为您不尊重pthread_create
:
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
正如你所看到的那样,第三个参数应该是一个函数指针,所以正确的强制转换是(void *(*)(void*))
,而client_sock
是start_routine
的参数,你必须采用像&client_sock