这段代码:
char buff[255];
memcpy(buff,0,255);
编译器在编译期间不会发出任何警告,但是该过程因分段错误而失败 但是当我编译以下代码时
char buff[255];
memcpy(buff,2,255);
编译器发出以下警告
警告:传递'memcpy'的参数2使得整数指针没有强制转换[默认启用]
为什么编译器不会给常量0发出警告 我正在使用GCC版本4.7.2
还有一些编译器标志会为这样的代码提供警告
答案 0 :(得分:13)
0
会隐式转换为空指针。 2
并未隐式转换为指针类型,因此警告。
您可以在comp.lang.c
FAQ, section 5阅读更多内容,特别是Question 5.2。
在这里的快速测试中,GCC和Clang都没有警告0
案例(没有额外的标志),但clang static analyzer确实:
example.c:6:4: warning: Null pointer argument in call to memory copy function
memcpy(buff,0,255);
^~~~~~~~~~~~~~~~~~
/usr/include/secure/_string.h:55:6: note: expanded from macro 'memcpy'
? __builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest)) \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
正如此处其他评论中所述,如果您通过-Wnonnull
(也包含在-Wall
中),GCC会发出警告:
$ gcc -Wnonnull example.c -o example
example.c: In function ‘main’:
example.c:6: warning: null argument where non-null required (argument 2)
答案 1 :(得分:3)
2
不是指针;因此你会收到警告。
0
是空指针,因此编译器看不到该代码有任何问题。
在memcpy()
的上下文中,传递空指针没有意义,但编译器没有对每个可能的非语义函数调用发出警告。
特别是在C语言中,您需要编写有意义的代码。
答案 2 :(得分:1)
因为指针上下文中的0
是空指针常量,而2是类型int
的整数,即使在指针上下文中也是如此。