我很好奇:
之间有什么不同:
const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);
和
char Buffer[MAX_BUF];
答案 0 :(得分:2)
案例1:
char Buffer[MAX_BUF];
Buffer
是 数组 ,大小为MAX_BUF
。分配技术称为VLA。
案例2:
const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);
Buffer
是一个 指针 ,它被分配了一个大小为MAX_BUF
的内存1000
。
并且,数组不与指针相同,C-FAQ has a Very Good collection detailing the reasons。
在可用性和行为方面的主要区别是:
答案 1 :(得分:2)
char* Buffer = malloc(MAX_BUF);
创建char
指针Buffer
,通过MAX_BUF
动态分配malloc
个字节的内存,并使Buffer
指向已分配空间的开头。这个内存在堆上分配。
char Buffer[MAX_BUF];
创建一个大小为Buffer
的数组MAX_BUF
,其中最多可包含MAX_BUF
个字符。请注意,您要创建Variable Length Array(C99中引入的功能),因为MAX_BUF
是一个变量。可以在堆栈上创建此数组。
答案 2 :(得分:2)
除了别人说的话,我还会在内存管理方面添加一些信息。
1)主要区别在于:
const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);
您需要手动管理已分配的内存,例如,在您完成使用后免费Buffer
。忘记free
它(或释放它两次)可能会导致麻烦。
2)第二种情况:
char Buffer[MAX_BUF];
你不需要任何东西。它会自动销毁。因此,您可以避免处理内存的任务 - 这很好。 您应该尝试总是评估您需要的方法。
有些观点。
答案 3 :(得分:0)
最显着的差异是范围。 VLA数组仅在声明它的范围内有效,而动态数组将在程序中的任何位置可用,直到您调用free()
。
实际上,如果编译器使用VLA的堆栈分配,则VLA可能比动态内存更快。但是,C标准没有规定分配VLA。
(编译器理论上可以在堆上分配VLA,但编译器也负责清理。我不认为存在任何此类解决方案。我使用过的每个编译器总是在堆栈上声明VLA。)
这意味着VLA不适合保存大量数据:您可能会面临堆栈溢出的风险。但是,当您使用动态内存时,这不是一个问题。
由于非常古老的编译器不支持VLA,因此VLA不具备与动态阵列相同的可移植性。从理论上讲,新的C11编译器也不必支持VLA,尽管此时我知道没有编译器愚蠢到足以放弃这种支持。比较/总结