CS50第1周:C语言动态数组分配整数各位元素失败求助
问题分析与修正方案
代码中的核心错误
- 类型不匹配:
get_long()返回long类型,但你用int num接收,小数字没问题但大整数会溢出,应该统一用long类型处理输入。 - 数组越界访问:C数组索引从0开始,长度为
length的数组合法索引是0~length-1,你写的array[length]直接越界,属于未定义行为,会导致数据存储异常。 - 未初始化内存访问:
malloc分配的内存是未初始化的,里面是随机垃圾值,你第一次打印数组时输出的是不确定值。 - 存储与输出逻辑混乱:你修改了
length变量导致索引错位,输出循环里重复打印未赋值的array[0],自然得不到预期结果。
修正后的代码
#include <stdio.h> #include <cs50.h> #include <stdlib.h> int countDigits(long num) { if (num == 0) // 处理输入0的特殊情况 return 1; int count = 0; while(num != 0) { count++; num = num / 10; } return count; } int main(void) { long num = get_long("num: "); long temp_num = num; // 保留原数字,避免修改后丢失 int length = countDigits(num); printf("Length: %d\n", length); // 分配动态内存并检查是否成功 int* array = malloc(length * sizeof(int)); if (array == NULL) { printf("Memory allocation failed\n"); return 1; } // 从数组末尾开始存数字,最终高位在索引0 int index = length - 1; while (temp_num != 0) { array[index] = temp_num % 10; temp_num = temp_num / 10; index--; } // 打印数组内容 printf("Result: "); for(int i = 0; i < length; i++) { printf("%d ", array[i]); } printf("\n"); free(array); // 释放内存,避免泄漏 return 0; }
关键修正说明
- 改用
long类型处理输入,匹配get_long()的返回值,同时避免大整数溢出。 - 新增
temp_num保存原数字,防止修改原数影响后续操作。 - 存储数字时从数组最后一位(
length-1)开始,依次存入每一位,这样原数字的最高位会落在索引0的位置,完全符合你的需求。 - 检查
malloc返回值,确保内存分配成功;使用完数组后调用free()释放内存,避免内存泄漏。 - 修复了输出逻辑,从索引0到
length-1遍历打印,正确输出各位数字。
内容的提问来源于stack exchange,提问作者GhostaNero
相关产品推荐
相关产品推荐

