【发布时间】:2022-11-12 15:10:01
【问题描述】:
我可以在运行时声明一个大小为 n 的数组,而无需在 c 中使用动态内存分配(malloc 等)吗?
【问题讨论】:
-
欢迎来到 SO。是的,对于局部变量,这在 C99 中是可能的。你可以在你的函数中定义一个数组
int arr[n]。查找“可变长度数组”(VLA)以获取更多详细信息。由于这通常是在堆栈上分配的,因此您应该注意不要分配太多。生命周期仅限于定义该数组的函数。这对于全局变量是不可能的。
我可以在运行时声明一个大小为 n 的数组,而无需在 c 中使用动态内存分配(malloc 等)吗?
【问题讨论】:
int arr[n]。查找“可变长度数组”(VLA)以获取更多详细信息。由于这通常是在堆栈上分配的,因此您应该注意不要分配太多。生命周期仅限于定义该数组的函数。这对于全局变量是不可能的。
根据定义在运行时声明一个可变大小的内存区域是动态内存分配,即使你不使用malloc。
正如 Gerhardh 所说,您可以使用 VLA 但有一些限制。但是,您应该小心使用它,因为它可能导致堆栈溢出。参见例如here。
还有一个在堆栈上分配动态内存的库(查找alloca)。它的好处是您不需要系统上的任何堆来使用它,但它不是标准的(AFAIK),也需要小心使用。
如果您想避免堆动态分配,可能是因为您使用的系统资源有限。在这种情况下,堆栈可能也受到限制,然后您应该考虑定义静态分配的变量以避免堆栈溢出。
【讨论】:
简短的回答:只需使用malloc、calloc 和free,除非你真的负担不起。
自 C99 以来,VLA(可变长度数组)成为标准:
int N;
scanf("%i", &N);
type Array[N]; //Size determined at runtime, grabbed from the stack
但是,在 C11 标准中,它们是由可选的实施,因为他们的加入受到了广泛的批评。
主要编译器实现了它们,但我不鼓励您使用它们(除非作为临时解决方案),因为:
【讨论】:
只需使用malloc,就这么简单:
#include <malloc.h>
int main(void)
{
const int n = 10; // Your array size
int* arr = (int*) malloc(n * sizeof(int));
// Access the pointer like an array
arr[0] = 100;
}
【讨论】: