此数组仅用一个元素初始化,并且只有第一个元素设置有变量,但是当我调用第一个和第二个元素时,它们都显示相同(即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
。
如果不初始化或设置第二个元素,就不会期望
答案 0 :(得分:3)
您在这里有两个问题:
C中的字符串是由以空字符终止的字符数组。由于您的数组只分配有一个字符,因此没有空格可用于终止符。
数组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;