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

CS50第1周:C语言动态数组分配整数各位元素失败求助

问题分析与修正方案

代码中的核心错误

  1. 类型不匹配:get_long() 返回 long 类型,但你用 int num 接收,小数字没问题但大整数会溢出,应该统一用 long 类型处理输入。
  2. 数组越界访问:C数组索引从0开始,长度为length的数组合法索引是0~length-1,你写的array[length]直接越界,属于未定义行为,会导致数据存储异常。
  3. 未初始化内存访问:malloc 分配的内存是未初始化的,里面是随机垃圾值,你第一次打印数组时输出的是不确定值。
  4. 存储与输出逻辑混乱:你修改了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:25:17