现在,在人们开始将其标记为重复项之前,我已经阅读了以下所有内容,但没有一个提供我所寻找的答案:
C FAQ和上述问题的许多答案都引用了一个神秘的错误,该错误malloc
会隐藏cast的返回值。但是,它们都没有在实践中给出此类错误的具体示例。现在注意我说的是错误,不是警告。
现在给出以下代码:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
在使用gcc 4.2和不使用强制类型转换的情况下编译上述代码会给出相同的警告,并且程序在两种情况下均会正确执行并提供相同的结果。
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
那么,谁能给出一个具体的代码示例,说明由于castmalloc
的返回值而可能发生的编译或运行时错误,或者这仅仅是城市传说?
编辑我遇到了两个有关此问题的书面论据:
- 支持强制转换:CERT咨询:立即将内存分配函数调用的结果强制转换为指向已分配类型的指针
- 反对投放广告 (自2012年2月14日起出现404错误:使用2010年1月27日的Internet存档Wayback Machine副本。{2016-03-18:“由于robots.txt,页面无法被抓取或显示。”})
void
指针允许将代码编译为C ++;有人说这是一个功能,我会说这是一个错误;)