为什么我得到这个错误? void *不是指向对象types的指针。

void *stackAddr[NUM_THREADS]; stackAddr[i] = malloc(STACKSIZE); 

编译器(g ++ 4.4.3)抱怨malloc被调用的地方…

 warning: pointer of type 'void *' used in arithmetic error: 'void*' is not a pointer-to-object type 

如果你有兴趣看到整个代码,在这里它…

 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define NUM_THREADS 4 void *stackAddr[NUM_THREADS]; pthread_t thread[NUM_THREADS]; pthread_attr_t attr; void *BusyWork(void *t) { int i; long tid; double result=0.0; tid = (long)t; printf("Thread %ld starting...\n",tid); for ( i = 0; i < 1000; i++) { result = result + sin(i*tid) * tan(i*tid); } printf("Thread %ld done. Result = %e\n", tid, result); pthread_exit((void*) t); } void pthread_create_with_stack( pthread_t * pthread, void *(*start_routine) (void *), int tid ) { const size_t STACKSIZE = 0xC00000; //12582912 void *stackAddr; int rc; size_t i; pthread_t thread; pid_t pid; stackAddr[tid] = malloc(STACKSIZE); // Error here! pthread_attr_setstack(&attr, stackAddr[tid], STACKSIZE); rc = pthread_create( pthread, &attr, start_routine, (void*)tid ); } int main (int argc, char *argv[]) { int rc; long t; void *status; /* Initialize and set thread detached attribute */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for(t=0; t<NUM_THREADS; t++) { printf("Main: creating thread %ld\n", t); rc = pthread_create_with_stack(&thread[t], BusyWork, t); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } } /* Free attribute and wait for the other threads */ pthread_attr_destroy(&attr); for(t=0; t<NUM_THREADS; t++) { rc = pthread_join(thread[t], &status); if (rc) { printf("ERROR; return code from pthread_join() is %d\n", rc); exit(-1); } printf("Main: completed join with thread %ld having a status" "of %ld\n",t,(long)status); } printf("Main: program completed. Exiting.\n"); pthread_exit(NULL); } 

Solutions Collecting From Web of "为什么我得到这个错误? void *不是指向对象types的指针。"

你正在声明一个局部变量void *stackAddr ,这会影响全局的stackAddr数组。

此外,它不是一个数组,并且应用[]下标运算符试图偏移和取消引用一个void指针,因此编译错误。

由于sizeof(void)是未定义的,因此标准将不允许对void指针进行解引用和指针运算。

你搞砸了你的声明:

 void *stackAddr; 

应该:

 void *stackAddr[]; 

(您可能还需要为阵列设置大小。)

然后你尝试这样做:

 stackAddr[tid] = malloc(STACKSIZE); 

所以你正在访问一个void*的数组元素。

现在你已经发布了真正的代码,我猜错误是在pthread_create_with_stack ,你有一个局部变量void * stackAddr隐藏全局数组。

它看起来像你应该删除本地变量。

你首先发布什么, 不是问题。

 void *stackAddr[NUM_THREADS]; 

但是在代码中你有其他的东西:

 void *stackAddr; 

所以编译器试图使用该局部变量,当然不能编译..

pthread_create_with_stack ,你有这样的代码:

 void *stackAddr; ... stackAddr[tid] = malloc(STACKSIZE) 

表达式stackAddr[tid]尝试对void*进行算术运算。

在C ++中,void指针没有属性,包括大小。 因此,您不能从数组开头计算i-number void的偏移地址。 它是在数组中的特定索引的规范是造成你的数学问题。

在你发布的版本中, stackAddr不是一个数组,而是分配给stackAddr[tid] 。 编译器用*(stackAddr + tid)替换它,其中括号表达式计算为stackAddr + tid * sizeof(void) ,所以编译器会警告你sizeof(void)