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

为何无需malloc()即可创建由用户输入确定大小的数组?

两种创建用户指定大小数组的方法

之前我一直觉得,要在编译完成后根据用户输入来确定数据结构的大小,必须靠malloc()来动态分配内存——示例1就是这种大家常用的实现方式;不过示例2提供了一个更简便的思路,完全不需要用到malloc()!

示例1:用malloc()创建用户指定大小的数组

这是动态分配内存的常规写法,兼容性拉满,不过需要手动管理内存的申请和释放:

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

int main() {
    int N;
    printf("Number: ");
    scanf("%d", &N);
    
    // 根据用户输入的大小分配对应字节的内存
    int *arr = (int *)malloc(N * sizeof(int));
    // 务必检查内存是否分配成功,避免空指针问题
    if (arr == NULL) {
        printf("内存分配失败!\n");
        return 1;
    }

    // 示例操作:给数组赋值并打印
    for (int i = 0; i < N; i++) {
        arr[i] = i + 1;
    }
    printf("数组元素:");
    for (int i = 0; i < N; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 手动释放内存,防止内存泄漏
    free(arr);
    arr = NULL; // 将指针置空,避免后续误操作野指针
    return 0;
}

示例2:无需malloc()的简便方法

这种方法用到了C99标准引入的变长数组(VLA),数组大小直接由用户输入的变量决定,内存分配在栈上,函数结束后会自动回收,不用手动处理释放:

#include <stdio.h>

int main() {
    int N;
    printf("Number: ");
    scanf("%d", &N);
    
    // 直接定义变长数组,大小由N动态决定
    int arr[N];

    // 示例操作:给数组赋值并打印
    for (int i = 0; i < N; i++) {
        arr[i] = i * 2;
    }
    printf("数组元素:");
    for (int i = 0; i < N; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 无需手动释放内存,函数退出时栈内存自动回收
    return 0;
}

小注意点

变长数组虽然简洁,但它是C99的特性,部分编译器(比如微软的MSVC)对它的支持有限;如果你的代码需要兼容更多环境,malloc()的方式会更稳妥。不过在支持C99及以上的编译器(比如GCC、Clang)里,VLA确实能让代码清爽不少~

内容的提问来源于stack exchange,提问作者seamus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:12:35