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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:15:39