当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?
我不知道为什么是有必要铸造的void
指针,int *
或char *
打印地址的内容存储器之前,即使我们告诉printf()
函数如何解释在内存中的数据?
假设我们有以下代码:
int main (void)
{
void* c = malloc(4);
printf("%d",*c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么不可能这样做?
所以要明确我的问题是这是不可能的原因是什么?
编辑: 在所有的答案和研究之后,我仍然不确定编辑中的致命错误究竟在哪里.我感到困惑的主要原因是我的编译器(gcc)在告诉"取消引用void指针"时只给出一个警告.这是实际的错误吗?据我所知,即使有警告,该程序仍应编译.
EDIT2 我仍然感到困惑的是我们有一个ERROR和WARNING的原因看起来是完全独立的,但是由同一段代码生成:
pointer.c:7:13: warning: dereferencing 'void *' pointer
printf("%d",*p);
^~
pointer.c:7:13: error: invalid use of void expression
printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)
有些用户说只有在我们尝试使用derefenciation的结果时才会出现错误,并且警告是在我们为VOID指针实际分配内存时.
显然不是这种情况,因为如果我们删除printf行,我们确实只会得到一个警告但是完全没有一个警告.
pointer.c:6:8: warning: unused variable 'p' [-Wunused-variable]
void * p=malloc(4);
Run Code Online (Sandbox Code Playgroud)