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

使用malloc()与realloc()扩展int数组后输出异常的原因咨询

问题分析与修复:malloc/realloc数组扩容后输出异常

你的代码存在两个关键问题,导致最终只输出前两个元素:

1. 错误计算数组长度

sizeof(array)/sizeof(array[0])无法正确获取动态分配数组的长度。原因是array是指针类型,不是静态数组——指针变量本身只存储内存地址,sizeof(array)得到的是指针的字节大小(32位系统为4,64位为8),而sizeof(array[0])是int的字节大小(通常为4),所以计算结果要么是1要么是2,这就是你只能看到前两个元素的根本原因。

动态分配的内存块不会自带长度信息,你必须自己用变量跟踪数组的当前容量或实际元素数量。

2. realloc使用的隐患(非本次输出问题,但必须修正)

直接将realloc的返回值赋值给原指针是危险的:如果realloc内存分配失败,会返回NULL,此时原指针会被覆盖为NULL,导致原来的内存块无法被释放,造成内存泄漏。正确的做法是先用临时指针接收realloc的结果,确认分配成功后再替换原指针。


修正后的代码

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    int *array = malloc(sizeof(int) * 2);
    if (array == NULL) {
        fprintf(stderr, "malloc 分配失败\n");
        return 1;
    }

    for (int x = 0; x < 10; x++) {
        // 用临时指针接收realloc结果
        int *temp_ptr = realloc(array, sizeof(int) * (2 + x));
        if (temp_ptr == NULL) {
            fprintf(stderr, "realloc 扩容失败\n");
            free(array); // 释放原内存,避免泄漏
            return 1;
        }
        array = temp_ptr;
        array[x] = x;
    }

    // 直接使用已知的元素数量10进行遍历
    for (int i = 0; i < 10; i++) {
        printf("%d\n", array[i]);
    }

    free(array);
    return 0;
}

修正说明

  • 新增了内存分配失败的检查逻辑,避免程序崩溃或内存泄漏;
  • 用临时指针处理realloc的返回值,保证原内存块的安全;
  • 遍历输出时直接使用循环次数(10次),因为我们明确知道要添加10个元素;如果是动态场景,可以额外维护一个变量记录实际元素数量。

内容的提问来源于stack exchange,提问作者Gert The Shmert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:55:20