鱼C论坛

 找回密码
 立即注册
查看: 1009|回复: 3

[已解决]定义了一个int res, 和一个 int 数组变量, 当数组赋值后, res 值被随机改变了, 请...

[复制链接]
发表于 2023-11-6 18:27:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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
最佳答案
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[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;
}

这样修改后,再次运行程序,输出结果应该是正确的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[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;
}

这样修改后,再次运行程序,输出结果应该是正确的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-6 18:28:39 | 显示全部楼层
这段代码中,变量res在第一次输出时值为1000,但在循环赋值数组num_list后,第二次输出时值为203,原因是循环赋值过程中可能超出了数组num_list的范围,导致内存被损坏,进而影响了变量res的值。建议检查数组下标是否越界,并且加上下标越界检查的代码。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢, 糊涂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 13:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表