2015-07-01 41 views
1

我试图做一个文件级或全局范围的数组,其大小在运行时确定。像this one各种制品建议此图案用于这种动态数组:当指针被声明为一个类型时,它如何解除引用'void *'?

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 *或类似的东西。

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

+4

好吧,显然'MISCTYPE'只是'void'的另一个名字。 MISCTYPE定义的方式和位置在哪里? – AnT

+0

@Olaf:与C++不同?当涉及到typedef名称的一般状态时,我不知道C和C++之间有什么区别。在C和C++中,typedef名称只是现有类型的别名,而不是新类型。 – AnT

+0

啊哈!这就是我没有挖掘到头文件!果然,它被定义为'typedef void MISCTYPE'。现在要弄清楚这是如何工作的... – ewall

回答

1

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

由此我们可以推断出该作业并未按照您的想法进行。在这一点上,我们必须问“什么是MISCTYPE”,并且我们使用您发布的代码无法推断出这一点。但是如果你对MISCTYPE是什么,我敢打赌你会找到答案。

+1

@Charlie Martin:这是C.在C中'void *'可以自由地和隐式地转换为任何数据指针类型。 'malloc'返回'void *'的事实的确让我们可以推出任何关于'handles'的东西。 – AnT

+0

@Olaf:我猜这是一个错字;我修好了它。 –

+0

@AnT“......从中我们推断出这个任务并不是在做你的想法。”无论MISCTYPE是什么,分配的结果仍然是一个“void *”。 –

2

呀,一定是有什么嬉戏的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; 
} 
相关问题