发生了什么神秘的事情?

时间:2017-04-24 09:13:44

标签: c arrays

我遇到与此代码相关的问题。

 #include <stdio.h>
 void main() 
 {
        char array[0];
        scanf("%s", array);
        printf("%s", array);
        return;
 } 

当我在输入字段中输入数据时,它会在数组中存储并获得输出,但它的大小为0.

另一件事情是,当我输入假设'a'12次然后以某种方式控制到达scanf()以获取输入并再次进入'a'12次控制再次达到{{1}这一直持续到我输入少于12个字符。

如果输入超过12个字符,程序将崩溃。

为什么会这样?

1 个答案:

答案 0 :(得分:5)

这样的陈述
 char array[0];

是符合ISO C的无效代码。这是纯粹的约束违规。大小必须大于0。

引用C11,章节§6.7.6.2(强调我的

  

除了可选的类型限定符和关键字static之外,[]可能会划界   表达式或*。如果它们分隔表达式(指定数组的大小),则   表达式应具有整数类型。 如果表达式是常量表达式,它应该是   值大于零。 [...]

那就是说,

  • void main()不是托管环境的符合签名。它至少需要int main(void)符合标准。

  • 在使用scanf()和家人时,始终

    • 通过提供最大字段宽度来限制输入的长度,例如

      char input [10] = {0};
      scanf("%9s", input);
      
    • 检查返回值以确保调用成功。