[英]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;
}
好的,首先,如果编译器告诉你handles
是void *
,你应该相信它。 现在,事实证明, malloc
返回void *
,从中我们推断, handles
仍然是一个void *
分配之后。
由此我们可以推断出任务没有按照你的想法进行。 在这一点上,我们不得不问“那么什么是MISCTYPE
”,而且我们使用您发布的代码无法推断出这一点。 但如果你了解MISCTYPE
是什么,我打赌你会找到答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.