【问题标题】:Why for loop and arr[5000]= {0, } changes unrealated variable in C?为什么 for loop 和 array[5000]= {0, } 在 C 中改变不相关的变量?
【发布时间】:2021-05-23 02:40:40
【问题描述】:

当我运行这段代码时,(在 Online C Compiler 和 OnlineGDB 上测试)
for(int i=1;i (这个 for 循环没有任何代码来改变 selfNumsum 变量)
我发现了一些改变 selfNumSum 变量的东西..

  1. arr[5001] = {0, };

当我删除“= {0, }”时,它会正常打印 0。

  1. for(int i=1;i

如果是 4976~,for 循环使 selfNumSum 为 5002。否则如果是 ~4975,则正常打印 0。


但我不知道为什么这些与 selfNumSum 有关。 (我想知道为什么它会改变这个)

(为什么 = {0, } 改变其他变量?为什么不相关的 for 循环改变 selfNumSum?)
代码

#include <stdio.h>

int arr[5001] = {0, };
int a;
int b;
int num;
int oneNum;
int sum=0;
int selfNumSum=0;

int selfNumber(int a, int b) {
printf("init = %d\n", selfNumSum);

/*This for loop makes selfNumSum to 5002*/
for(int i=1;i<=5000;i++) {
    //printf("i = %d, selfnumsum = %d\n", i, selfNumSum);
    if(sum<=5000) {
        num=i;
        sum=i;
        while(num>=1) {
            oneNum=num%10;
            num=num/10;
            sum+=oneNum;
        }
        sum+=num;
        arr[sum] = sum;    
    }
}

printf("selfNumSum = %d\n", selfNumSum);

for(int i=a;i<=b;i++) {
    if(arr[i]==0) {
        printf("+%d\n", i);
        selfNumSum+=i;
    }
}

return selfNumSum;
}


int main() {
    scanf("%d %d", &a, &b);
    selfNumSum = selfNumber(a, b);
    printf("%d", selfNumSum);
}



输入

1 10

输出

init = 0
selfNumSum = 5002
+1
+3
+5
+7
+9
5027


如果我把selfNumSum-5002或者delete ={0, },打印正常,但是我想知道为什么这些改变selfNumSum?
(对不起我的英语不好..)

【问题讨论】:

  • sum+=num; arr[sum] = sum; sum 的值变得大于5000,因此在用作索引时导致缓冲区溢出。如果您不相信,那么只需添加代码来检查该情况。

标签: c for-loop variables printing


【解决方案1】:

您在 selfNumSum 之前声明了 arr[5001] 所以这意味着您修改 arr[sum] 其中 sum >= 5001。即超出范围,而您恰好覆盖了一个不相关的变量。

通过调试器运行代码并在 selfNumSum (gdb: watch selfNumSum) 上设置数据断点,或者在 sum &gt;= 5001 时在 arr[sum] = sum 行上设置条件断点。您还可以在执行 arr[sum] = sum; 之前添加调试语句以打印 sum 以验证 sum >= 5001。

我做了后者,发现行 sum+=oneNum; 导致 sum 变为 5002,而您在 lop 的后期迭代中给出了输入。另外,请注意 sum+=num; 不会做任何事情,因为 num 在 while 循环之后始终为 0。

【讨论】:

  • 对不起,请问为什么它会覆盖 if(sum
  • arr[sum] 与 *(arr + sum) 相同,因此 arr + sum 是内存中的地址。如果 sum >= 5001 您正在数组本身之外写入。那里存储的还有其他变量,例如 selfNumSum。您可以printf("%p", &amp;selfNumSum) 看到该地址并将它的 arr 地址与printf('%p', arr) 进行比较。
  • 为什么总和 >= 5001?我在arr[sum] = sum; 之前添加了printf("sum = %d\n", sum);,并使用了输入1 10,最后一次迭代给了我sum = 5002。然后代码正在执行 arr[5002] 并且超出范围。
  • num在while循环后总是为零,所以问题是sum+=oneNum;
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 2017-06-14
  • 2019-06-20
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多