可变长度与Malloc-ed数组

可变长度与Malloc-ed数组,c,arrays,C,Arrays,根据c99标准,我们可以编写以下代码,这是完全合法的 int x; scanf("%d",&x); int ar[x]; 我的问题是,如果我可以像这样分配一个数组,为什么我需要malloc再次分配可变大小的数组 另外,您能解释一下可变长度数组是如何分配的吗?在内心深处,它调用malloc来分配数组还是什么?我想到了两个原因: 超出此堆栈帧的数组 大于堆栈的数组 可变长度数组分配(或任何实际的数组声明)在堆栈上完成(假设为GCC编译器)。Malloc从堆中分配内存 堆与堆栈的两个优点:

根据c99标准,我们可以编写以下代码,这是完全合法的

int x;
scanf("%d",&x);
int ar[x];
我的问题是,如果我可以像这样分配一个数组,为什么我需要malloc再次分配可变大小的数组


另外,您能解释一下可变长度数组是如何分配的吗?在内心深处,它调用malloc来分配数组还是什么?

我想到了两个原因:

  • 超出此堆栈帧的数组
  • 大于堆栈的数组

  • 可变长度数组分配(或任何实际的数组声明)在堆栈上完成(假设为GCC编译器)。Malloc从堆中分配内存

    堆与堆栈的两个优点: 1.堆栈要小得多。可变大小数组很有可能导致堆栈溢出。 2.堆栈上分配的项在返回中声明的函数之后不会继续存在。

    在中,变长数组变成了“可选”数组,我将其理解为“实现定义的”,因此它们不再可移植

    如图所示

    6.7.6.2第4节阵列声明器

    可变长度数组是一种有条件的特性,可用于实现 不需要支持

    6.10.8.3条件特征宏第1节

    \uuuu STDC\u NO\u VLA\uuu
    整数常量1,用于指示实现不支持可变长度数组或可变长度数组 修改类型

    使用
    malloc
    优于VLA的一些优点是:

    • malloc
      的实现通常从 在大多数C实现中,它是比堆栈更大的资源。但是,未提及堆栈 在C标准中,它们是实现全局和本地内存的常用方法
    • malloc
      获得的内存可以增加或减少
      realloc
      但这在VLA中是不可能的
    • malloc
      获得的内存可以在程序中传递,直到
      free
      d,带指针,但VLA只能在层次结构中使用 函数的定义。VLA在其运行的功能结束后变为死机 已定义的返回,因为它超出范围

    如果希望从函数返回数组或将其存储在结构中,会发生什么情况?C中的对象生存期是。。。有趣。因为
    malloc()
    'd数组的存储是不同的,所以堆。您可能也对这个问题感兴趣:@CiroSantilli的可能重复六四事件法轮功包卓轩 此问题比您链接的问题早两年。3。可以从函数返回的数组。但我想这已经包括在第1项中了。@hexa这就是第1项的全部内容了谢谢你们的回答,伙计们,现在这很有意义了。我仍然有一些东西,如何在C中实现可变长度数组?假设我使用的是gcc编译器。哦,对不起。我用了一个不好的短语,实际上我是这个意思。不过,编译器是如何实现它的?你们有什么简单的方法可以解释吗?再次感谢。@Roddy我100%同意你的观点,但不幸的是,这些东西的官方术语实际上是可变长度数组。算了吧!您的“优势”#2也是一个潜在的劣势,也是导致内存泄漏的常见原因。堆栈上的数组(小心使用)通常是良好的做法。