所以我有这个代码:
#include <stdio.h>
int main()
{
printf("enter charactern>>>");
char input[0];
scanf("%5s",input);
printf("%s",input);
}
除了来自用户的 5 个字符。我是C的新手,这件事对我来说毫无意义。为什么 gcc 允许我编译一个程序,为长度为 0 的数组分配值?这当然是不可能的吗?请解释一下。
编译器应该拒绝声明无效
如果表达式是常量表达式,则其值应大于零。(6.7.6.2).
但是,正如下面@Joshua指出的那样,某些编译器支持此功能作为扩展:
在 GNU C 中允许声明零长度数组作为扩展(信息 gcc; 6.18)
gcc -pendatic -pedantic-errors
将生成错误,并且仅警告而不-pedantic-errors
。
scanf()
和printf()
也将是未定义的行为。
C 不检查缓冲区溢出。
这一点值得重复。
C 不检查缓冲区溢出。
这在很长一段时间内一直是错误的来源;但它也是C固有的,无法改变。
在一些简单的情况下,编译器可以检测到缓冲区溢出(通常也启用了优化),但在一般情况下它不能;它也不会生成任何运行时检查。它只会做一些意想不到的事情。如果您允许,这通常是一个安全问题。
您必须检查自己是否没有溢出缓冲区。