计划的输出:
#include <stdio.h>
int main()
{
int size;
printf("Enter the size of array: ");
scanf("%d",&size);
int b[size],i = 0;
printf("Enter %d integers to be printed: ",size);
while(i++ < size)
{
scanf("%d",&b[i]);
printf("%d %d\n", i, b[i]);
}
return 0;
}
表示size = 5
和输入数字:
0 1 2 3 4
是
1 0
2 1
3 2
4 3
5 4
其中第一列用于i
,第二列用于数组b
的元素
很明显,循环i
中的while(i++ < size) {
在进入循环之前递增到1
。此循环必须存储/打印值b[1], b[2], b[3], b[4]
,而不是b[5]
,因为循环将在i = 5
处终止。
此代码如何打印b[5]
的值?
我已经针对不同的数组size
测试了它,并且它没有打印任何垃圾值。
答案 0 :(得分:2)
通过读取和写入数组,程序会调用未定义的行为。这并不意味着必须崩溃或打印垃圾值,它可以假装工作正常。显然,这就是这种情况下发生的事情。
答案 1 :(得分:1)
在循环中,在i < size
递增之前检查条件i
。但是,i
在进入循环体之前递增而不是在它之后,因此在这种情况下可以访问b[5]
,因为i
在检查i < size
后会增加与i=4
一起使用。你不希望这样,因为这会导致未定义的程序行为。
如果您尝试访问数组中不存在的元素,例如array[size]
,您正在访问阵列后面的内存中的下一个位置。在这种情况下,你很幸运,但如果这意味着你正在访问不允许你的程序执行的内存的一部分,那么你将获得segmentation fault
。
答案 2 :(得分:1)
您可以使用用于周期而不是而,而不是while(i++<size)
您可以使用for(i = 0; i < size; i++)
来解决您的问题我的朋友:)