c - 当我只能定义一个可变长度数组时,为什么要使用 malloc()?

标签 c arrays

我正在阅读有关在 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 至少有五个好处。

  1. 最值得注意的是,使用 malloc 创建的对象在当前 block 执行结束后仍然存在。这意味着这些对象可以(通过指针)返回给函数的调用者。这种用法在实际应用中很常见。当 block 的执行结束时,创建为可变长度数组的数组将不复存在。

  2. malloc 创建的数组可以用 realloc 调整大小。可变长度数组不能调整大小。

  3. 自 2011 C 标准起,可变长度数组对于 C 实现来说是可选的,可以支持。任何质量的通用 C 实现都将支持它们,但它们是可选的这一事实意味着旨在可移植的代码必须要么不使用可变长度数组,要么必须通过测试预处理器宏来防止缺乏支持 __STDC_NO_VLA__ 并提供备用代码。

  4. 通常,可变长度数组的大小比使用 malloc 分配的数组要小得多。可变长度数组通常使用堆栈空间实现,堆栈通常限制在一些不太大的兆字节(尽管在构建可执行文件时通常可以增加)。对于使用 malloc 创建的对象,在现代系统中可能有千兆字节的内存可用。

  5. 如果使用 malloc 创建数组失败,将返回 NULL,程序员可以轻松编写代码来检测并处理它。如果可变长度数组的创建失败,操作系统的常见行为是由于某些内存错误而终止程序。 (各种 C 实现可能提供拦截此错误的方法,但它比测试 nullmalloc 返回值要麻烦得多,而且它不可移植。)

关于c - 当我只能定义一个可变长度数组时,为什么要使用 malloc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51448301/

相关文章:

php - PHP 中使用一个特定键从数组中提取值的通用函数

python - Propellerheads 的 NN-XT 文件格式 : Problems with REFE chunk

c++ - extern "C"extern 变量在 C++ 程序中作为类变量寻求..如何声明它?

在源文件中一致地使用类型

c - 如何解释这行 C 代码中的星号?

java - 快速排序 - 线程 "main"java.lang.ArrayIndexOutOfBoundsException : -1 中的异常

c++ - 我可以将符号数组传递给宏吗?

javascript - 如何从数组中获取不匹配的元素?

javascript - Vue JS显示所选数组的内容

c - 函数指针的外部数组