下面是一个C程序,用于查找给定数组中的平衡点。
#include <stdio.h>
void equilibrium(int a[], int n)
{
int i;
int rsum[n], lsum[n];
lsum[0] = a[0];
rsum[0] = a[n-1];
for (i = 1 ; i < n ; i++) {
lsum[i] = lsum[i-1]+a[i];
}
printf("lsum array: ");
for (i = 0 ; i < n ; i++) {
printf("%d ",lsum[i]);
}
printf("\n\nrsum array: ");
for (i = n - 1 ; i >= 0 ; i--) {
rsum[i] = rsum[i + 1] + a[i];
}
for (i = 0 ; i < n ; i++) {
printf("%d ", rsum[i]);
}
printf("\n\n");
for (i = 1 ; i < n ; i++) {
if (lsum[i] == rsum[i])
printf("\n\n%d is equilibrium point", i);
}
}
int main()
{
int a[8] = {-1,3,-4,5,1,-6,2,1};
//printf("\n\n");
equilibrium(a,8);
return 0;
}
此代码输出如下正确:
lsum array: -1 2 -2 3 4 -2 0 1
rsum array: 1 2 -1 3 -2 -3 3 1
1 is equilibrium point
3 is equilibrium point
7 is equilibrium point
取消注释
时会出现问题printf("\n\n");
在main()
函数中。
现在输出变化如下:
lsum array: -1 2 -2 3 4 -2 0 1
rsum array: -45602127 -45602126 -45602129 -45602125 -45602130 -45602131 -4560212
5 -45602127
如果我在声明“int value = 1
”数组之前包含另一个int变量,说“int a[8]
”,则输出更改为:
lsum array: -1 2 -2 3 4 -2 0 1
rsum array: 3 4 1 5 0 -1 5 3
这与记忆有关吗?
有人可以提供一个有效的理由说明为什么会这样吗?
答案 0 :(得分:3)
在这个循环中
for (i = n - 1 ; i >= 0 ; i--) {
rsum[i] = rsum[i+1]+a[i];
^^^^^^^^
在数组边界之外有一个访问内存。因此,结果取决于数组后存储在内存中的内容。
答案 1 :(得分:2)
正如用户xing在this comment中指出的那样,您的代码正在访问超出边界的数组。因为在相应循环的第一次迭代中,行
rsum[i + 1] + a[i]
正在rsum
访问n
,这是rsum
结束后的1个位置。这将导致已知的未定义行为。
添加或删除printf()
的效果只会改变生成的程序的内存布局,这与定义另一个变量时发生的情况相同。实际上,对程序内存布局的任何更改都会影响它的行为,因此单词 undefined 。