繁体   English   中英

当用类型声明指针时,如何解除引用'void *'?

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

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

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

好的,首先,如果编译器告诉你handlesvoid * ,你应该相信它。 现在,事实证明, malloc返回void * ,从中我们推断, handles仍然是一个void *分配之后。

由此我们可以推断出任务没有按照你的想法进行。 在这一点上,我们不得不问“那么什么是MISCTYPE ”,而且我们使用您发布的代码无法推断出这一点。 但如果你了解MISCTYPE是什么,我打赌你会找到答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM