相关疑难解决方法(0)

什么是严格别名规则?

当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?

c strict-aliasing undefined-behavior type-punning

778
推荐指数
10
解决办法
19万
查看次数

为什么在将地址在指针中的内存中打印之前,我们必须将void指针强制转换为int或其他内容?

我不知道为什么是有必要铸造的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)

c pointers void void-pointers dereference

4
推荐指数
2
解决办法
926
查看次数