当用类型声明指针时,这怎么能取消引用“void *”?

How can this be dereferencing ‘void *’ when the pointer was declared with a type?

我正在尝试创建一个文件级或全局范围的数组,其大小在运行时确定。像 this one 这样的各种文章建议这种动态数组的模式:

static MISCTYPE *handles;
static int nthreads;

int main(int argc, char **argv) {
    // nthreads set from from argv
    handles = malloc(nthreads * sizeof(MISCTYPE));
    for(i = 0; i < nthreads; i++) {
        handles[i] = miscfunction();
    ...
    free(handles);
    return 0;
}

int otherfunction(...) {
    for(i = 0; i < nthreads; i++) {
        handles[i] = miscfunction();
    ...
}

然而,无论我在哪里使用像数组一样的指针(即 handles[i]),编译器都会说 warning: dereferencing ‘void *’ pointer,然后是 error: invalid use of void expression

但这不是空指针!它肯定有一个类型(此伪代码中的 MISCTYPE),将其重新转换为相同的类型并不能阻止错误。我没有将它作为 void * 或类似的东西传递给任何地方。

这是怎么回事?更重要的是,我能做些什么呢?

是的,MISCTYPE 肯定有问题,因为下面的示例工作正常:

#include <stdio.h>
#include <stdlib.h>

static int *handles;

int main(int argc, char **argv)
{

    int i = 0;
    handles = malloc(20 * sizeof(int));
    for(i = 0; i < 20; i++) {
        handles[i] = i;
    }

    free(handles);
    return 0;
}

好吧,首先,如果编译器告诉你 handles 是一个 void *,你应该相信它。现在,结果是 malloc returns 一个 void *,由此我们推导出 handles 赋值后仍然是一个 void *

据此我们可以推断出作业没有按照您的想法进行。在这一点上,我们必须询问 "so what is MISCTYPE",而我们使用您发布的代码无法推断出这一点。但是如果你理解 MISCTYPE 是什么,我打赌你会找到答案。