|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
这样修改后,再次运行程序,输出结果应该是正确的。
|
|