【发布时间】:2018-03-07 16:42:04
【问题描述】:
请解释以下程序的输出,为什么数组打印到第 10 个数组索引,如果我不以空字符终止字符串,它总是打印数组的大小,然后循环终止,这意味着它现在找到空字符。每次我发现最后的大小相同时,我都会检查不同大小的数组,然后
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
char name[10];
for(i=0;i<10;i++)
{
name[i]='A';
}
for(i=0;name[i]!='\0';i++)
{
printf("%d %d\n",i,name[i]);
}
}
OUTPUT is
0 65
1 65
2 65
3 65
4 65
5 65
6 65
7 65
8 65
9 65
10 10
【问题讨论】:
-
这只是运气。你的代码读取它在内存中发现的任何垃圾,直到它找到一个碰巧在那里的空字节。
-
UB。你只是变得“幸运”(有些人可能会说“不幸”)。内存中的数组后面恰好有一个 0。 Ide 产生不同的结果:ideone.com/nhbS4r
-
引用
name[10]会产生未定义的行为,因此任何事情都可能发生。在您的情况下可能发生的情况是 name + 10 寻址堆栈上name旁边的整数的最低有效字节,恰好是 10。下一个有效字节是 0,通过 name + 11 寻址。 -
嗨,Rajiska,这可能是运气,但我只是在试验,我发现每次它打印数组的大小然后它终止意味着找到一个空值。
-
我正在使用 gcc 编译,我知道程序可能已经崩溃,这只是运气,但我感兴趣的是为什么它总是打印数组的大小,然后立即在我拥有的下一个内存块中找到一个空值每次都检查了数百次,无论如何我总是用空值终止我的字符串。谢谢