使用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
相关产品推荐
相关产品推荐

