错误:无法使用'void'类型的左值初始化'int'类型的变量

时间:2016-11-24 10:16:46

标签: c pthreads

我正在尝试pthread示例。这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void*AsalK1(void *gelen);
int main(){

int *i;
i= new int;
*i=1;

int sonSayi;
pthread_t th1, th2, th3, th4;
printf("---------------------------------------------\n");
printf("|       Threadler ile Asal Sayi Bulma       |\n");
printf("---------------------------------------------\n");
printf("Son sayi degeri: 1000000 \n");

int r1=pthread_create( &th1, NULL, AsalK1, (void *)i);
    *i=3;
int r2=pthread_create( &th2, NULL, AsalK1, (void *)i);
    *i=5;
int r3=pthread_create( &th3, NULL, AsalK1, (void *)i);
    *i=7;
int r4=pthread_create( &th4, NULL, AsalK1, (void *)i);

pthread_join( th1, NULL);
pthread_join( th2, NULL);
pthread_join( th3, NULL);
pthread_join( th4, NULL);
    return 0;
}
void *AsalK1(void *gelen){
int bas= *gelen;
    printf("bas :&d\n",bas);    
 }

我用这段代码编译:

gcc -lpthread ThreadDeneme.cpp

g++ -lpthread ThreadDeneme.cpp

错误说:

  

无法使用左值类型初始化类型为'int'的变量   'void'int bas = * gelen;

我用这个:

  

int bas =(int *)gelen;

但错误仍在进行中。

我看了:

What is the difference between these uses of pointers?

5 个答案:

答案 0 :(得分:5)

1)您不能取消引用void *。所以,

int bas= *gelen;

无法运作。阅读int的正确方法是:

int bas= *(int*)gelen;

2)但这也不会起作用。因为相同的地址i被传递给所有4个线程,并且导致data race。因此,您需要将不同的地址传递给每个线程,以避免数据竞争(或使用某种形式的同步)。

3)你的线程函数AsalK1()应该返回一个指针(参见pthread_create()对线程函数的要求)。 你可以简单地返回一个NULL指针,因为你没有从线程返回主线程。

4)另一个潜在的问题是如何编译:

gcc -lpthread ThreadDeneme.cpp

库应位于命令行选项的末尾。所以,你编译为:

gcc ThreadDeneme.cpp -lpthread

另一个相关的建议:你可以使用 array 而不是使用4个不同的线程id变量(th1..4)。它允许使用循环来创建和连接线程,你也可以轻松地改变线程数。

答案 1 :(得分:1)

解决与错误消息相关的问题,您需要具有完整类型才能取消引用该错误消息。变化

 int bas= *gelen;

int bas= *(int *)gelen;

FWIW,void是一个不完整的类型,

  

void类型包含一组空值;它是一个不完整的对象类型   无法完成。

对于C ++,引用C++14,(强调我的

  

一元*运算符执行间接:应用它的表达式应该是指向的表达式   对象类型或指向函数类型的指针,结果是引用对象或函数的左值   表达点所指向的。如果表达式的类型是“指向T的指针”,结果的类型是   “T。” [注意:通过指向不完整类型(除了cv void )的指针间接有效。左值   如此获得的可以以有限的方式使用(例如,初始化参考);这个左值不能   转换为prvalue,]

答案 2 :(得分:1)

你必须使用

int bas= *(int *) gelen;

首先转换为int类型的指针,然后使用*取消引用它

答案 3 :(得分:1)

int bas= *gelen;

正如您在void * AsalK1(void * gelen)函数中看到的那样,gelen是无效指针 并且您必须根据您的情况将类型转换为有效的数据类型 因为bas是int数据类型所以要在int bas中存储所以gelen指针应该是intpecase到int *,如下所示

int bas= *(int *) gelen;

答案 4 :(得分:0)

您需要将其强制转换为int类型的指针。 printf中也有错误。

void *AsalK1(void *gelen){
int *bas= (int *) gelen;
    printf("bas :%d\n",*bas);    
 }