c/c++语言开发共享程序的输出随printf()语句而变化

下面是一个C程序,用于找到给定数组中的平衡点。

#include  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 = 0 ; i--) { rsum[i] = rsum[i + 1] + a[i]; } for (i = 0 ; i < n ; i++) { printf("%d ", rsum[i]); } printf("nn"); for (i = 1 ; i < n ; i++) { if (lsum[i] == rsum[i]) printf("nn%d is equilibrium point", i); } } int main() { int a[8] = {-1,3,-4,5,1,-6,2,1}; //printf("nn"); 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("nn"); 

main()函数中。

现在输出变化如下:

 lsum array: -1 2 -2 3 4 -2 0 1 rsum array: -45602127 -45602126 -45602129 -45602125 -45602130 -45602131 -4560212 5 -45602127 

如果我在声明“ int a[8] ”数组之前包含另一个int变量,说“ int value = 1 ”,则输出变为:

 lsum array: -1 2 -2 3 4 -2 0 1 rsum array: 3 4 1 5 0 -1 5 3 

这与记忆有关吗?

有人可以提供一个有效的理由说明为什么会这样吗?

    正如用户@ xing在此评论中指出的那样,您的代码正在访问超出边界的数组。 因为在相应循环的第一次迭代中,该行

     rsum[i + 1] + a[i] 

    n处访问rsum ,这是在rsum结束后的1个位置。 这将导致已知的未定义行为。

    添加或删除printf()只会更改生成的程序的内存布局,这与定义另一个变量时发生的情况相同。 实际上,对程序内存布局的任何更改都会影响它的行为,因此单词undefined

    在这个循环中

     for (i = n - 1 ; i >= 0 ; i--) { rsum[i] = rsum[i+1]+a[i]; ^^^^^^^^ 

    在数组边界之外有一个访问内存。 因此,结果取决于数组后存储在内存中的内容。

      以上就是c/c++开发分享程序的输出随printf()语句而变化相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549875.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐