可变长度与Malloc-ed数组
根据c99标准,我们可以编写以下代码,这是完全合法的可变长度与Malloc-ed数组,c,arrays,C,Arrays,根据c99标准,我们可以编写以下代码,这是完全合法的 int x; scanf("%d",&x); int ar[x]; 我的问题是,如果我可以像这样分配一个数组,为什么我需要malloc再次分配可变大小的数组 另外,您能解释一下可变长度数组是如何分配的吗?在内心深处,它调用malloc来分配数组还是什么?我想到了两个原因: 超出此堆栈帧的数组 大于堆栈的数组 可变长度数组分配(或任何实际的数组声明)在堆栈上完成(假设为GCC编译器)。Malloc从堆中分配内存 堆与堆栈的两个优点:
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的一些优点是:
的实现通常从 堆在大多数C实现中,它是比堆栈更大的资源。但是,未提及堆和堆栈 在C标准中,它们是实现全局和本地内存的常用方法malloc
- 从
获得的内存可以增加或减少malloc
但这在VLA中是不可能的realloc
- 从
获得的内存可以在程序中传递,直到malloc
d,带指针,但VLA只能在层次结构中使用 函数的定义。VLA在其运行的功能结束后变为死机 已定义的返回,因为它超出范围free
malloc()
'd数组的存储是不同的,所以堆。您可能也对这个问题感兴趣:@CiroSantilli的可能重复六四事件法轮功包卓轩 此问题比您链接的问题早两年。3。可以从函数返回的数组。但我想这已经包括在第1项中了。@hexa这就是第1项的全部内容了谢谢你们的回答,伙计们,现在这很有意义了。我仍然有一些东西,如何在C中实现可变长度数组?假设我使用的是gcc编译器。哦,对不起。我用了一个不好的短语,实际上我是这个意思。不过,编译器是如何实现它的?你们有什么简单的方法可以解释吗?再次感谢。@Roddy我100%同意你的观点,但不幸的是,这些东西的官方术语实际上是可变长度数组。算了吧!您的“优势”#2也是一个潜在的劣势,也是导致内存泄漏的常见原因。堆栈上的数组(小心使用)通常是良好的做法。