jermey1994 发表于 2023-11-6 18:27:58

定义了一个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

isdkz 发表于 2023-11-6 18:28:15

问题的关键在于数组越界访问。在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;
}


这样修改后,再次运行程序,输出结果应该是正确的。

Mike_python小 发表于 2023-11-6 18:28:39

这段代码中,变量res在第一次输出时值为1000,但在循环赋值数组num_list后,第二次输出时值为203,原因是循环赋值过程中可能超出了数组num_list的范围,导致内存被损坏,进而影响了变量res的值。建议检查数组下标是否越界,并且加上下标越界检查的代码。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

jermey1994 发表于 2023-11-6 18:33:31

isdkz 发表于 2023-11-6 18:28
问题的关键在于数组越界访问。在for循环中,当i等于nsi - 1时,num_list[ i]会被赋值为i,但是当i等于nsi时 ...

谢谢, 糊涂了{:5_92:}
页: [1]
查看完整版本: 定义了一个int res, 和一个 int 数组变量, 当数组赋值后, res 值被随机改变了, 请...