操作数类型为'void',需要算术或指针类型 - C

4

我正在使用这个方法

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];

当我尝试将cols1中的值赋给变量"value"时,出现了"操作数类型为'void',需要算术或指针类型"的错误。我做错了什么?有什么建议吗?完整代码在这里

1
首先,你在 col_check 中的 malloc(9) 应该改为 malloc(sizeof(int) * 9) - Rogus
最好使用calloc(9, sizeof(int)) - ranu
在调用任何堆分配函数(malloc,calloc,realloc)时: 1)不要对返回的值进行强制类型转换。返回的类型是void*,可以分配给任何其他指针。强制类型转换只会使代码混乱,使其更难以理解、调试等。 2)始终检查(!=NULL)返回的值,以确保操作成功。 - user3629249
1
为了方便理解和可读性,应通过单个空白行分隔代码块(for、if、else、while、do...while、switch、case、default)。一致地缩进代码。在每个开括号'{'后缩进。在每个闭括号'}'前取消缩进。建议每个缩进级别使用4个空格。 - user3629249
这一行:void * cols; 应该改为:int * cols; - user3629249
显示剩余2条评论
2个回答

10
在代码 (int)cols[1] 中,(int) 的优先级比 [1] 低,因此编译器会先尝试计算 cols[1]
然后,编译器无法计算 cols[1],因为 void* 没有指向已知大小的项目。 如果编译器不知道 cols[0] 的大小,那么它怎么能确定 cols[1] 在哪里呢?
我不确定你想做什么,但你可能想要的是 int value = ((int*)cols)[1];

谢谢,问题已解决。现在错误已经消失了。不管怎样,我试图检查变量值是否为空。我尝试使用if(value == NULL),但似乎是错误的。您对此有什么意见吗? - Joel Shevin
NULL扩展为0,因此if(value == NULL)实际上是检查value是否为0。这不是你想要的。另外,value不能为null,因为只有指针可以为null,而value不是指针,它是一个int。你可能想要做的是在尝试读取其指向的值之前检查cols是否为null。 - Mike Nakis
你如何检查 (cols==NULL)?我不确定该怎么做,因为我对C语言非常陌生。 - Joel Shevin
1
你真是救了我的命。我正在使用Pthreads,当调用线程函数时,我的void*参数是一个int数组。我无法将其转换为简单的int,一直提示void*int不兼容。但是将其更改为((int*)array)[i]后,一切都变了! - Azurespot

1

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

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

void* malloc( size_t size );

你只分配了9个连续字节,如果你想要9个连续的int字节,你需要这样做:

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

或者:

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

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


谢谢,是的,Mike的回答起作用了,我也遵循了你的建议。 - Joel Shevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接