当用类型声明指针时,这怎么能取消引用“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
是什么,我打赌你会找到答案。
我正在尝试创建一个文件级或全局范围的数组,其大小在运行时确定。像 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
是什么,我打赌你会找到答案。