首页 > 解决方案 > 当我可以定义一个可变长度数组时,为什么要使用 malloc()?

问题描述

我正在阅读有关在 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 版本有关?

标签: carrays

解决方案


malloc使用可变长度数组至少有五个好处。

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

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

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

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

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


推荐阅读