我正在阅读有关在 C 中动态创建数组的内容。所以那里描述的正确方法是:
int n;
scanf("%d", &n);
int *arr = (int*)malloc(n*sizeof(int));
但后来我想如果我能做这样的事情-
int n, i, sum=0;
scanf("%d", &n);
int arr[n];
我编译并运行它没有任何错误。所以,我的问题是为什么要使用 malloc()
?这个和C版本新旧有关系吗?
最佳答案
在可变长度数组上使用 malloc
至少有五个好处。
最值得注意的是,使用
malloc
创建的对象在当前 block 执行结束后仍然存在。这意味着这些对象可以(通过指针)返回给函数的调用者。这种用法在实际应用中很常见。当 block 的执行结束时,创建为可变长度数组的数组将不复存在。用
malloc
创建的数组可以用realloc
调整大小。可变长度数组不能调整大小。自 2011 C 标准起,可变长度数组对于 C 实现来说是可选的,可以支持。任何质量的通用 C 实现都将支持它们,但它们是可选的这一事实意味着旨在可移植的代码必须要么不使用可变长度数组,要么必须通过测试预处理器宏来防止缺乏支持
__STDC_NO_VLA__
并提供备用代码。通常,可变长度数组的大小比使用
malloc
分配的数组要小得多。可变长度数组通常使用堆栈空间实现,堆栈通常限制在一些不太大的兆字节(尽管在构建可执行文件时通常可以增加)。对于使用malloc
创建的对象,在现代系统中可能有千兆字节的内存可用。如果使用
malloc
创建数组失败,将返回NULL
,程序员可以轻松编写代码来检测并处理它。如果可变长度数组的创建失败,操作系统的常见行为是由于某些内存错误而终止程序。 (各种 C 实现可能提供拦截此错误的方法,但它比测试null
的malloc
返回值要麻烦得多,而且它不可移植。)
关于c - 当我只能定义一个可变长度数组时,为什么要使用 malloc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51448301/