c语言 - 为什么我可以将项目分配给长度为 0 的数组?



所以我有这个代码:

#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固有的,无法改变。

在一些简单的情况下,编译器可以检测到缓冲区溢出(通常也启用了优化),但在一般情况下它不能;它也不会生成任何运行时检查。它只会做一些意想不到的事情。如果您允许,这通常是一个安全问题。

您必须检查自己是否没有溢出缓冲区。

最新更新