【问题标题】:statically define an array based on a variable value C/C++基于变量值 C/C++ 静态定义数组
【发布时间】:2011-08-17 09:57:57
【问题描述】:

我想静态定义一个二维数组。数组的大小由变量决定。 我该怎么做呢?我不想动态定义数组。我听说有办法做到这一点。

【问题讨论】:

    标签: c++ c arrays memory-management definition


    【解决方案1】:

    我不认为你可以静态定义它!但是你可以使用向量,但在它下面也可以为你动态分配

    【讨论】:

      【解决方案2】:

      通过“变量”,我假设您说的是非常量值。

      在 C99 中,是的:

      int size = ...;
      int array[size][size];
      

      在 C++ 中,你不能。另一种方法是使用指针和动态分配(或者更好的是,向量)。

      在 C99 之前的 C 版本中,这也是不可能的。使用malloc()

      【讨论】:

      • 我假设在内部这是在堆栈上的可变大小?
      • @Michael:你的意思是数组是在栈上分配的?
      • @Namratha:除非您使用newmalloc 来动态分配内存,否则对象是在堆栈上创建的。此外,newmalloc 用于在堆上分配动态内存并将pointer 指向它。 Arrays are NOT pointers & 是的,它们是在堆栈上分配的。
      【解决方案3】:

      如果数组的其中一个维度是可变的,那么大小必须是可变的,那么它必须是动态调整大小的 - 或者以这样一种方式调整数组的大小,即静态调整数组的大小大于变量所能承受的最大值是。

      【讨论】:

        【解决方案4】:

        答案是 No You Can in C++
        数组的维度必须在编译时知道。

        int my_array[6][7];   // okay  
        int my_array[H][7];   // ISO C++ forbids variable length array 
        int my_array[6][W];   // ISO C++ forbids variable length array 
        int my_array[H][W];   // ISO C++ forbids variable length array 
        

        一些编译器通过自己的扩展支持Variable Length Arrays(VLA),但VLA在C++标准中没有定义,因此使用VLA将不符合C++标准。

        VLA 是在 C99 C 标准中引入的。 C++ 是从 C98 的 C 标准分支出来的。到 C 引入 VLA 时,C++ 已经有了 Vectors,不需要支持或鼓励 VLA。因此,C++ 标准从未正式接受 VLA,一些 C++ 编译器仍然通过编译器扩展支持 VLA。

        既然你标记了你的 Q C 和 C++,总结一下答案:

        In C99 & versions after that : You Can  
        Versions before C99: You Can't
        In C++(Any version): You can(through compiler extensions) but You should'nt
        

        这是传说中的C++ FAQ,它解释了有关数组的一切。
        我从中学到了很多。 :)

        【讨论】:

        • 嗯,这些数组声明好像oddly familiar... ;-)
        • @FredOverflow:在答案中添加了链接。很抱歉延迟添加,有一个 sprint 会议:(
        【解决方案5】:

        这取决于变量的初始化位置和时间。如果它是在编译时完成的,你可以使用模板来完成它:template </* args */> struct ConstExpr{enum{value = /* math goes here */};};,否则如果没有自我修改代码是不可能的(我很确定这会非常危险,因为你需要改变 PE 所以你可以在虚拟化之前以某种方式让您分配的空间发生变化)。

        【讨论】:

          猜你喜欢
          • 2012-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-14
          相关资源
          最近更新 更多