为何无需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
相关产品推荐
相关产品推荐

