懂C语言的帮我看看这段程序!

来源:百度知道 编辑:UC知道 时间:2024/05/12 10:30:10
main()
{ int n[3],i,j,k;
for(i=0;i<3;i++)
n[i]=0;
k=2;
for(j=0;j<k;j++)
n[j]=n[i]+1;
printf("%d\n",n[1];)
}
结果是3,为什么?

for(i=0;i<3;i++)
n[i]=0;
循环结束后,i=3;
for(j=0;j<k;j++)
n[j]=n[i]+1; //这里你将n[i]即n[3]赋给n[j],得不到正确结果

for ( i = 0; i < 3; i ++ )
n[i] = 0;
这个语句通过3次循环将n[0],n[1]和n[2]都置为0,此时i = 3.
接下来,将2赋值给k.
for ( j = 0; j < k; j ++ )
n[j] = n[i] + 1;
实际上,k在这里并没有变化,可以看作:
for ( j = 0; j < 2; j ++ )
n[j] = n[i] + 1;
该循环共执行2次:
第一次j = 0,i = 3。即n[0] = n[3] + 1;
第二次j = 1,i = 3。即n[1] = n[3] + 1;
第三次j = 2,结束循环。

在开始时你应该已经看到,n[]是一个只包含3个元素的数组,只有n[0],n[1]和n[2]被赋值为0,而n[3]根本就是越界的元素,所以其值是不确定的,因此后面的循环对n[0]、n[1]的赋值也是不确定的。

第一个for循环结束后:n[0]=0,n[1]=0,n[2]=0,i=3;
此时把3作为数组下标已经越界,会出现异常啊

楼上说的很清楚了,a[3] 会占用a[]地址后面的数据,其值也会随机。涉及计算机内部存储问题。