int main()
{
char a[7] = "Network";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C中的字符串文字在内部以nul字符终止.因此,上面的代码应该给出编译错误,因为字符串文字的实际长度Network是8并且它不能适合char[7]数组.
但是,Ubuntu上的gcc(即使有-Wall)编译此代码时没有任何错误或警告.为什么gcc允许这样做而不将其标记为编译错误?
当char数组大小小于字符串文字时,gcc只发出警告(仍然没有错误!).例如,它警告:
char a[6] = "Network";
Run Code Online (Sandbox Code Playgroud)
[相关] Visual C++ 2012给出了一个编译错误char a[7]:
1>d:\main.cpp(3): error C2117: 'a' : array bounds overflow
1> d:\main.cpp(3) : see declaration of 'a'
Run Code Online (Sandbox Code Playgroud) 我知道C中的字符串只是字符数组。因此,我尝试了以下代码,但给出了奇怪的结果,例如垃圾输出或程序崩溃:
#include <stdio.h>
int main (void)
{
char str [5] = "hello";
puts(str);
}
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?
它可以用干净地编译gcc -std=c17 -pedantic-errors -Wall -Wextra。
注意:对于在声明字符串时未能为NUL终止符分配空间而引起的问题,本帖子旨在用作规范的FAQ。