为什么循环和arr[5000]={0,}在C中更改了不相关的变量?
当我运行此代码时,(在联机C编译器和OnlineGDB上测试)为什么循环和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]
对于(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