马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
定义了一个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[100];
res = num * num * num; // 10 * 10 * 10
printf("res = %d\n", res); // 这里输出正常 1000
for (i = 1; i < res; i += 2)
{
num_list[nsi] = 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[j];
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;
}
输出结果:[jermey@localhost sel20]$ 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[100];
res = num * num * num; // 10 * 10 * 10
printf("res = %d\n", res); // 这里输出正常 1000
for (i = 1; i < res; i += 2)
{
num_list[nsi] = 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[j];
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;
}
这样修改后,再次运行程序,输出结果应该是正确的。
|