You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言二维数组实现圣诞老人礼物追踪程序崩溃问题求助

排查圣诞老人礼物追踪程序崩溃的原因

嘿,咱们来一步步拆解你代码里导致崩溃的几个核心问题:

1. 数组声明时机错误,使用未初始化变量定义数组大小

你在声明二维数组int KidsInStreet[houses][kids];的时候,houses和kids还没被用户输入赋值——这两个变量此时是未初始化的垃圾值,用它们定义数组大小会导致数组内存分配完全混乱,后续的读写操作必然会踩坏内存,引发崩溃。

正确的做法是:先通过scanf获取houses和kids的有效值,再声明数组(如果用栈上数组,注意C99及以后版本才支持变长数组;也可以用malloc做动态内存分配)。

2. scanf传参错误,未传递变量地址

看这行代码:

scanf("%d", KidsInStreet[i][j]);

scanf的第二个参数需要是变量的地址,这样它才能把用户输入的值写入对应内存位置。你直接传KidsInStreet[i][j]的话,相当于把数组里的垃圾值当成了内存地址,写入操作会直接访问非法内存,这大概率是程序输入第二户后崩溃的直接原因。

应该改成:

scanf("%d", &KidsInStreet[i][j]);

3. 循环条件导致数组越界

你的循环用了i<=houses和j<=kids,但数组索引是从0开始的。比如如果街道有houses户家庭,数组的行索引范围是0到houses-1,循环条件应该是i < houses;同理列索引的循环条件要改成j < kids,否则会访问数组不存在的位置,触发内存错误。

另外,你的输入提示语句也有问题:printf("Enter the number of kids in house %d:\n", i+1, j+1);里的j+1是多余的,你要问的是第i+1户的相关信息,不需要第二个参数。

修正后的代码示例

void distribute_presents() {
    int houses, kids=0;
    // 先获取用户输入的有效数值
    printf("Enter the number of houses in the street?\n");
    scanf("%d", &houses);
    printf("Enter the number of rooms (or kid groups) per house?\n");
    scanf("%d", &kids);
    
    // 用有效值声明变长数组(C99及以上支持)
    int KidsInStreet[houses][kids];
    int i, j;

    // 循环条件改为 < ,避免越界
    for (i=0; i < houses; i++) {
        for (j=0; j < kids; j++) {
            // 修正提示语句,匹配二维数组的逻辑
            printf("Enter the number of kids in group %d of house %d:\n", j+1, i+1);
            scanf("%d", &KidsInStreet[i][j]); // 传递变量地址
        }
    }

    printf("The presents needed for each group:\n");
    for(i=0; i < houses; i++) {
        printf("House %d: ", i+1);
        for(j=0; j < kids; j++) {
            printf("%d ", KidsInStreet[i][j]);
        }
        printf("\n");
    }
}

如果你其实只想追踪每户家庭的总孩子数(不需要二维数组),可以简化成一维数组int KidsInStreet[houses];,然后用单层循环输入每户的孩子数,逻辑会更清晰,也能避免不必要的二维数组操作。

内容的提问来源于stack exchange,提问作者Barry B Benson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:44:43