C考试字符数组

PiD*_*DEV 3 c arrays char

我正在做上一年的C编程考试。我想到了这个:

一个程序(见下文)定义了两个变量x和y。

它产生给定的输出。解释为什么字符“ A”出现在变量x的输出中。

程序:

#include <stdio.h>
main ()
{
    char x[6] = "12345\0";
    char y[6] = "67890\0";
    y[7]='A';
    printf("X: %s\n",x);
    printf("Y: %s\n",y);
}   
Run Code Online (Sandbox Code Playgroud)

程序输出:X:1A345 Y:67890


它有很高的分数(7)。而且我不知道如何详细解释。我的答案是:

char数组(y)仅分配了6个char,因此更改第7个字符将更改堆栈中的第2个字符。

任何帮助将不胜感激!(我只有一年级)

bar*_*nos 5

您的正式答案应该是该程序产生未定义的行为

C语言标准未定义越界访问操作的结果。

使用char y[6],通过从中读取或写入y[7],这就是您正在执行的操作。

一些编译器可能选择在堆栈中的数组x[6]之后立即分配数组y[6]

因此,通过编写'A'y[7],这个计划可能确实写'A'x[1]

但是该标准没有规定,因此取决于编译器的实现。


正如其他人暗示的那样,如果您的问题确实是在正式考试中给出的,那么您可能要考虑在其他地方继续学习...

  • @ZoffDino:首先,我很抱歉这个说法似乎或听起来很光顾。这不是本意。但是,在所有应得的尊重下,如果您的老师在考试中给您类似的问题,然后根据整个班级是错误的说法将其排除在外,那么他要么还不够体面,不能承认自己在提出此类问题上是错的,否则他不具备足够的知识,就无法理解问题本身就是错误的。“解释为什么字符''A'`出现在变量'x`的输出中”-根本不能保证`'A'`会出现在变量x中! (3认同)
  • 最重要的是,您的老师可能给了您一个类似的问题,希望您回答“未定义的行为”,但是当前的问题明确指出,字符“ A”出现在数组“ x”中,即根本不一定是真的。 (2认同)