在下面的C代码中,为什么第二个元素自动获取数组的第一个元素的值

时间:2019-01-05 16:36:10

标签: c arrays

此数组仅用一个元素初始化,并且只有第一个元素设置有变量,但是当我调用第一个和第二个元素时,它们都显示相同(即a)...

我想要整个数组“ temp”,但是我没有得到输出“ a”,而是 “ aa”,因为第二个元素也以某种方式具有值“ a” ...

关于未定义的行为的顺便说一句...我只是想使用数组“ temp”作为字符串(解释%s)并只使用一个值...但我总是得到两个(即aa)所以当时我想到要遍历循环,看看为什么会发生,然后我看到第二个元素也具有价值...

int main(void)
{
    char c = 'a';
    char temp[1];
    temp[0] = c;
    printf("the whole array is:%s", temp);
    printf("the first element is %c and second is %c\n",temp[0],temp[1]);
    return 0;
}

预期结果为a。 实际结果是aa

如果不初始化或设置第二个元素,就不会期望

2 个答案:

答案 0 :(得分:3)

您在这里有两个问题:

  1. C中的字符串是由以空字符终止的字符数组。由于您的数组只分配有一个字符,因此没有空格可用于终止符。

  2. 数组char temp[1];仅包含一个字符。因此,在您的printf()语句中,temp[0]是合法的,但temp[1]不是合法的。

这两种情况都会导致所谓的“不确定行为”。这意味着几乎所有事情都会发生,因为结果不是由C标准定义的。

答案 1 :(得分:1)

您的代码是UB(未定义行为)。数组中只有一个元素,但是您访问了两个元素。您还printf字符串-printf函数正在访问其边界之外的数组。因此任何输出都是可能的。

通过添加第二个元素以终止零来更改代码

char c = 'a';
char temp[2];
temp[1] = 0;
temp[0] = c;
printf("the whole array is:%s", temp);
printf("the first element is %c and second is %c\n",temp[0],temp[1]);
return 0;