现在,在人们开始评论这个问题之前,我已经阅读了以下所有内容,但没有一个能给出我想要的答案:
C FAQ 和上述问题的许多答案都引用了一个神秘的错误,即转换 malloc
的返回值可以隐藏这个错误; 然而,它们都没有给出实践中这种错误的具体例子。现在请注意我说的是 错误而不是 警告。
现在给出以下代码:
#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
那么,有没有人能够给出一个特定的代码示例,说明由于转换 malloc
的返回值而可能发生的编译或运行时错误,或者这只是一个都市传说?
编辑 关于这个问题,我遇到过两个写得很好的论点: