定义了一个int res, 和一个 int 数组变量, 当数组赋值后, res 值被随机改变了, 请...
定义了一个int res, 和一个 int 数组变量, 当数组赋值后, res 值被随机改变了, 请教一下鱼油们!代码:
#include <stdio.h>
int isNisk(int num);
int isNisk(int num)
{
int i, j, res;
int sum = 0, nsi = 0, si = -1, ei = -1;
int num_list;
res = num * num * num; // 10 * 10 * 10
printf("res = %d\n", res); // 这里输出正常 1000
for (i = 1; i < res; i += 2)
{
num_list = i;
nsi++;
}
printf("res = %d\n", res); // num_list赋值完后 res值被改变
for (i = nsi - 1; i > 0; i--)
{
sum = num_list;
for (j = i - 1; j > 0; j--)
{
sum += num_list;
if (sum == res){
si = j;
ei = i;
printf("res = %d\n", res);
goto ResCount;
}
if (sum > res)
{
break;
}
}
}
ResCount:
printf("%d = ", res);
for (i = si; i <= ei; i++)
{
if (i > si)
{
printf(" + ");
}
printf("%d", num_list);
}
printf("\n");
return 0;
}
int main()
{
int num;
printf("请输入一个整数:");
scanf("%d", &num);
isNisk(num);
return 0;
}
输出结果:
$ gcc test4.c && ./a.out
请输入一个整数:10
res = 1000
res = 203
res = 203
203 = 23 + 25 + 27 + 29 + 31 + 33 + 35
问题的关键在于数组越界访问。在for循环中,当i等于nsi - 1时,num_list[ i]会被赋值为i,但是当i等于nsi时,num_list[ i]会越界访问数组。这会导致内存中的res值被修改,从而导致后续打印res的结果不正确。
要解决这个问题,需要将for循环中的条件改为i >= 0。这样就可以正确访问数组中的元素,而不会越界。修改后的代码如下:
#include <stdio.h>
int isNisk(int num);
int isNisk(int num)
{
int i, j, res;
int sum = 0, nsi = 0, si = -1, ei = -1;
int num_list;
res = num * num * num; // 10 * 10 * 10
printf("res = %d\n", res); // 这里输出正常 1000
for (i = 1; i < res; i += 2)
{
num_list = i;
nsi++;
}
printf("res = %d\n", res); // num_list赋值完后 res值被改变
for (i = nsi - 1; i >= 0; i--)
{
sum = num_list[ i];
for (j = i - 1; j >= 0; j--)
{
sum += num_list;
if (sum == res){
si = j;
ei = i;
printf("res = %d\n", res);
goto ResCount;
}
if (sum > res)
{
break;
}
}
}
ResCount:
printf("%d = ", res);
for (i = si; i <= ei; i++)
{
if (i > si)
{
printf(" + ");
}
printf("%d", num_list[ i]);
}
printf("\n");
return 0;
}
int main()
{
int num;
printf("请输入一个整数:");
scanf("%d", &num);
isNisk(num);
return 0;
}
这样修改后,再次运行程序,输出结果应该是正确的。 这段代码中,变量res在第一次输出时值为1000,但在循环赋值数组num_list后,第二次输出时值为203,原因是循环赋值过程中可能超出了数组num_list的范围,导致内存被损坏,进而影响了变量res的值。建议检查数组下标是否越界,并且加上下标越界检查的代码。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:} isdkz 发表于 2023-11-6 18:28
问题的关键在于数组越界访问。在for循环中,当i等于nsi - 1时,num_list[ i]会被赋值为i,但是当i等于nsi时 ...
谢谢, 糊涂了{:5_92:}
页:
[1]