我正在阅读有关在C中动态创建数组的信息.所以正如我所描述的那样:
int n;
scanf("%d", &n);
int *arr = (int*)malloc(n*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
但后来我想如果我能做这样的事 -
int n, i, sum=0;
scanf("%d", &n);
int arr[n];
Run Code Online (Sandbox Code Playgroud)
我编译并运行它没有任何错误.所以,我的问题是我为什么要使用malloc()?这是否与旧版和新版C有关?
使用malloc可变长度数组至少有五个好处.
最值得注意的是,malloc在执行当前块之后使用persist 创建的对象结束.这意味着可以将这些对象(通过指针)返回给函数的调用者.这种用法在实际应用中很常见.当块的执行结束时,作为可变长度数组创建的数组不再存在.
创建的数组malloc可以调整大小realloc.无法调整可变长度数组的大小.
从2011 C标准开始,可变长度数组对于C实现来说是可选的.任何质量的通用C实现都将支持它们,但它们是可选的这一事实意味着旨在可移植的代码必须不使用可变长度数组或必须通过测试预处理器宏__STDC_NO_VLA__并提供防止缺乏支持替代码.
通常,可变长度数组的大小比分配的数组要大得多malloc.可变长度数组通常使用堆栈空间来实现,并且堆栈通常限于某些不大量的mebibytes(尽管在构建可执行文件时通常可以增加).对于用其创建的对象malloc,可以在现代系统中使用gibibytes的内存.
如果数组的创建失败malloc,NULL将返回,并且程序员可以轻松编写代码来检测并处理它.如果创建可变长度数组失败,则通常的行为是操作系统终止程序时出现一些内存错误.(各种C实现可能提供拦截此错误的方法,但它比测试malloc返回值更令人讨厌NULL,并且它不可移植.)