【问题标题】:How to declare array size at runtime without using dynamic memory allocation如何在运行时声明数组大小而不使用动态内存分配
【发布时间】:2022-11-12 15:10:01
【问题描述】:

我可以在运行时声明一个大小为 n 的数组,而无需在 c 中使用动态内存分配(malloc 等)吗?

【问题讨论】:

  • 欢迎来到 SO。是的,对于局部变量,这在 C99 中是可能的。你可以在你的函数中定义一个数组int arr[n]。查找“可变长度数组”(VLA)以获取更多详细信息。由于这通常是在堆栈上分配的,因此您应该注意不要分配太多。生命周期仅限于定义该数组的函数。这对于全局变量是不可能的。

标签: arrays c


【解决方案1】:

根据定义在运行时声明一个可变大小的内存区域动态内存分配,即使你不使用malloc

正如 Gerhardh 所说,您可以使用 VLA 但有一些限制。但是,您应该小心使用它,因为它可能导致堆栈溢出。参见例如here

还有一个在堆栈上分配动态内存的库(查找alloca)。它的好处是您不需要系统上的任何堆来使用它,但它不是标准的(AFAIK),也需要小心使用。

如果您想避免堆动态分配,可能是因为您使用的系统资源有限。在这种情况下,堆栈可能也受到限制,然后您应该考虑定义静态分配的变量以避免堆栈溢出。

【讨论】:

    【解决方案2】:

    简短的回答:只需使用malloccallocfree,除非你真的负担不起。

    自 C99 以来,VLA(可变长度数组)成为标准:

    int N;
    scanf("%i", &N);
    type Array[N]; //Size determined at runtime, grabbed from the stack
    

    但是,在 C11 标准中,它们是由可选的实施,因为他们的加入受到了广泛的批评。

    主要编译器实现了它们,但我不鼓励您使用它们(除非作为临时解决方案),因为:

    1. Messy 二维数组的语义,
    2. 可能会炸毁你的筹码(如果你不小心的话),

      此外, VLA 不是 C++ 规范的一部分。

      不过不要误会我的意思,它们在 ex 中有它们的用途。嵌入式编程,其中堆分配(即*alloc-family 函数)可能不可靠!

      如果您使用的是 msvc,您可以检查 _malloca(和 _alloca),它们执行显式动态大小的堆栈分配。

      但是,如果您真的需要这些,请再考虑一下。

    【讨论】:

    • @EugeneSh。如果他将来想使用 C++,仍然值得一提。所有这些要点仅在某些情况下相关,因此我认为提及与 C++ 的不兼容性没有任何问题。
    • @EugeneSh。固定的。
    【解决方案3】:

    只需使用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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2014-12-14
      • 2022-01-02
      • 2017-06-06
      • 2021-06-21
      • 1970-01-01
      • 2017-05-31
      • 2017-06-25
      • 1970-01-01
      相关资源
      最近更新 更多