C语言运行时动态扩容数组/指针(编译期未知长度)问题咨询
问题解答与代码修正
1. 是否可以直接对数组进行动态扩容?
不行。C语言里普通数组(包括栈上声明的固定长度数组、全局数组,甚至C99的变长数组VLA)的内存大小都是静态确定的,一旦定义完成就没法在运行时直接扩容。
2. 若不可行,是否应使用int类型指针?
是的,这是正确的方案。通过int*类型指针配合malloc/realloc这类动态内存分配函数,就能在运行时根据需求灵活调整内存块大小,实现动态扩容的效果,你代码的整体思路是对的,只是输出逻辑出了问题。
代码错误分析与修正
你预期输出012但实际得到000,问题出在打印语句:printf("%d", *arr);。*arr等价于arr[0],也就是数组的第一个元素,你每次循环都打印它,自然三次输出都是0。而你每次赋值的是arr[n++],也就是扩容后的新元素位置,应该打印这个位置的值。
另外,建议检查realloc的返回值,避免内存分配失败导致程序崩溃。
修正后的代码:
#include <stdlib.h> #include <stdio.h> int main() { int *arr = NULL; size_t n = 0; for (int i = 0; i < 3; ++i) { // 先接收realloc的返回值,避免分配失败丢失原指针 int *temp = realloc(arr, (n + 1) * sizeof *arr); if (temp == NULL) { free(arr); fprintf(stderr, "内存分配失败\n"); return 1; } arr = temp; arr[n++] = i; // 打印刚赋值的元素 printf("%d", arr[n-1]); } // 释放动态分配的内存 free(arr); return 0; }
这段代码运行后会输出预期的012。
内容的提问来源于stack exchange,提问作者ecjb
相关产品推荐
相关产品推荐

