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

