在我的answer我提到,取消引用void
指针是一个坏主意。但是,当我这样做时会发生什么?向理解空指针
#include <stdlib.h>
int main (void) {
void* c = malloc(4);
*c;
&c[0];
}
编译:
gcc prog.c -Wall -Wextra
prog.c: In function 'main':
prog.c:4:2: warning: dereferencing 'void *' pointer
*c;
^~
prog.c:5:4: warning: dereferencing 'void *' pointer
&c[0];
^
prog.c:5:2: warning: statement with no effect [-Wunused-value]
&c[0];
^
这里是Wandbox对于那些谁说这没有发生过的图像:
和Ideone一个现场演示。
它实际上会尝试读取c
指向的内存,然后获取该结果,但最终没有做任何事情?或者这条线不会有任何影响(但是GCC不会产生警告)。
我在想,由于编译器不知道有关数据类型的任何信息,因此在不知道该类型的大小的情况下,它将无法做得太多。
为什么取消拒绝void*
不会产生错误,但只是一个警告?
如果我尝试的任务,我会得到一个错误:
invalid use of void expression
但不应独解引用产生一个错误?
由于'void'是一个不完整的类型,无法完成,因此解除引用'void *'应该生成一个编译器诊断。 –
某些编译器在指向时假定为1的空间大小(至少使用指针算术) –
@JonathanLeffler是的这就是我所说的,我希望发生错误。让,让我们专注于GCC。 – gsamaras