为什么循环和arr[5000]={0,}在C中更改了不相关的变量?

为什么循环和arr[5000]={0,}在C中更改了不相关的变量?,c,for-loop,variables,printing,C,For Loop,Variables,Printing,当我运行此代码时,(在联机C编译器和OnlineGDB上测试) 对于(int i=1;i您在selfNumSum之前声明了arr[5001],因此这意味着您修改了arr[sum],其中sum>=5001。即超出范围,并且您恰好覆盖了一个不相关的变量 通过调试器运行代码,并在selfNumSum(gdb:watch selfNumSum)上设置一个数据断点,或者在arr[sum]=sum行上设置一个条件断点(当sum>=5001时)。您还可以添加一个调试语句来打印sum,然后再执行arr[sum]

当我运行此代码时,(在联机C编译器和OnlineGDB上测试)

对于(int i=1;i您在selfNumSum之前声明了arr[5001],因此这意味着您修改了arr[sum],其中sum>=5001。即超出范围,并且您恰好覆盖了一个不相关的变量

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


我做了后者,发现行
sum+=oneNum;
使用您在lop的后期迭代中提供的输入使sum变为5002。另外,请注意
sum+=num;
没有任何作用,因为while循环后
num
始终为0。

sum+=num;arr[sum]=sum;
sum的值变得大于
5000
,因此当用作索引时会导致缓冲区溢出。如果您不相信,则只需添加代码来检查该条件。对不起,我可以问一下为什么它会在If(sumarr[sum]与*(arr+sum)中覆盖一个不相关的变量因此,arr+sum是内存中的地址。如果sum>=5001,则在数组本身之外写入。存储的是其他变量,如selfNumSum。您可以
printf(“%p”,&selfNumSum)
查看该地址,并将其与
printf(“%p',arr)
进行比较。为什么sum>=5001?我添加了
printf(“sum=%d\n”,sum)
arr[sum]=sum;
之前,使用输入110,最后一次迭代给了我
sum=5002
。然后代码执行arr[5002],这超出了界限。
num
在while循环之后总是为零,所以问题是
sum+=oneNum;
#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