类型的操作数' void'需要算术或指针类型的地方 - C.

时间:2017-04-22 20:26:18

标签: c integer type-conversion void

我正在使用这种方法

void * col_check(void * params) {
parameters * data = (parameters *) params;
int startRow = data->row;
int startCol = data->col;
int *colm = malloc(9);
for (int i = startCol; i < 9; ++i) {
    int col[10] = {0};
    for (int j = startRow; j < 9; ++j) {
        int val = data->arr1[j][i];
        if (col[val] != 0) {
            colm[i]=i;
        }
        else{
            col[val] = 1;
        }
    }
}
return colm;    
}

我想将colm数组中的值传递给主程序。所以我使用下面的行来做到这一点。基本上colm数组存储的是arr1的列索引,根据数独规则无效。 (不重要)。

parameters * param10 = (parameters *) malloc(sizeof(parameters));
    param10->row = 0;
    param10->col = 0;
    param10->arr1 = arr1;

void * cols;

pthread_create(&thread_10, NULL, col_check, (void *) param10);
pthread_join(thread_10, &cols);

printf("Calculating column validity please wait.\n");
    sleep(mdelay);

int c;
int value= (int)cols[1];

我收到错误&#34;操作数类型&#39; void&#39;需要算术或指针类型的地方&#34;当我尝试将cols 1中的值变为变量&#34; value&#34;时。我究竟做错了什么 ?有什么建议?完整代码here

2 个答案:

答案 0 :(得分:4)

(int)cols[1] (int)部分的优先级低于[1]部分,因此编译器首先尝试评估cols[1]

然后编译器无法计算cols[1],因为void*未指向已知大小的项目。如果编译器不知道cols[0]有多大,那么它如何找出cols[1]的位置?

我不确定您要做什么,但可能想要的是int value = ((int*)cols)[1];

答案 1 :(得分:1)

@Mike Nakis已经提供了一个很好的答案,我将修复你的一个语法错误。

当你将colm声明为整数列矩阵的指针时,你做错了。 malloc定义为:

void* malloc( size_t size );

你只分配9个连续的字节,如果你想要9个连续的整数字节,你必须这样做:

int *colm = malloc(sizeof(int)*9);

或:

int *colm = calloc(9, sizeof(int));

在我看来,后者更为可取。但要么做同样的事情,除了calloc也将分配的存储中的所有字节初始化为零。