繁体   English   中英

程序的输出通过printf()语句更改

[英]Output of the program changes with printf() statement

下面是一个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变量,则在声明“ int a[8] ”数组之前说“ int value = 1 ”,输出将更改为:

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

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

这和记忆有关吗?

有人可以提供一个合理的原因来说明为什么会这样吗?

在这个循环中

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

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

正如@ xing用户在此注释中指出的那样,您的代码正在访问数组。 因为在相应循环的第一次迭代中,

rsum[i + 1] + a[i]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM