【问题标题】:Declaring variable sized array without using dynamic memory allocation在不使用动态内存分配的情况下声明可变大小的数组
【发布时间】:2012-10-12 16:11:54
【问题描述】:

我想在不使用 new 运算符的情况下在函数中分配可变大小的 2D 数组,以便该 2D 数组可用于同一文件中的其他函数。

    void draw(int i)
    {   size=i;   }

    void assign(char symbol)
    {
        char one[size][size];
        /// ... Assigning values to one  ...
    }
    void display()
    {   /// Displaying values of one[size][size]
        for(int i=0;i<size;i++)
        {
            for(int j=0;j<size;j++)
            cout<<one[i][j];
            cout<<endl;
        }
    }

函数的执行顺序是draw -> assign -> display

这个问题之前可能已经问过了。 但我的问题是.. -> 我无法在全局分配函数之外声明数组,因为大小的值是未知的。 -> 我不能在“显示”函数中使用“一个”数组,因为它的范围仅限于“分配”函数。

而且我也不想使用 new 或 malloc 运算符。 如果有任何替代方案,请提供帮助。

【问题讨论】:

  • std::vector 听起来很完美。
  • 您是否关心newmalloc 是否在幕后被调用?
  • std::vector 非常适合您的目的。您可以创建一个大小为零的数组,然后使用 resize(int size) 方法更改其大小。 STL 提供了其他方法来管理数组/向量。

标签: c++ dynamic scope


【解决方案1】:

C++ 不支持堆栈分配的可变长度数组,例如 C99。您应该改用std::vector&lt;T&gt;。如果你真的想使用堆栈分配,你可以使用alloca()

【讨论】:

  • 我认为您的意思是 alloca 而不是 calloc
  • @ThomasMatthews 我的意思是alloca()
  • 默认情况下,std::vector&lt;T&gt; 使用动态内存。 @Jekin 必须创建一个 std::vector 分配器调用 alloca()
  • @Thomas Matthews2:我很好奇:如何创建可用于std::vector 的分配器? alloca 在调用者的栈帧上分配,这里是allocator::allocate,与声明std::vector 的栈帧不同。
【解决方案2】:

没有办法做到这一点。数组“one”是分配函数中堆栈上的临时变量。每当您离开分配功能时,它都会被销毁。

所以你需要以某种方式分配内存。

如果您一次只使用“一个”数组的一个副本,您可以在全局范围内声明它,并且空间足够大以提供舒适的上限。并在每次使用时检查静态全局数组是否足够大。

你关注的表现是?还是您在无法分配内存的平台上?

其他一些选项:在系统外部静态分配数组,并将其作为参数传递给每个函数。

或者,如果所有函数都可以从单个更高级别的“所有者”函数调用,您可以使用“alloca”在堆栈上动态分配数组。

例如

system()
{
   char one = alloca( size );
   draw( one, ... );
   assign( one, ...);
   display( one, ... );
}

【讨论】:

    【解决方案3】:

    如果您不想使用动态内存分配,那么您必须支付分配超出所需内存的额外内存的成本。 您将数组的大小定义为足够大以处理手头的数据。 喜欢,

    int arr[my_limit];

    注意my_limit 必须是一个常量表达式。

    在问题中提到的程序中,数组“one”的内存需求仅在运行时确定,因此使用动态内存分配是一个好习惯。

    【讨论】:

      【解决方案4】:

      我在 c++ 方面并不完美,实际上我和你一样是新手。但是我认为您可以使用

      "*pointer"
      

      我的意思是你应该显示你的数组的引用。然后就可以在函数外使用了。

      【讨论】:

        【解决方案5】:
        const int MAX_SIZE = 1000;
        char one[MAX_SIZE][MAX_SIZE];
        int size = 0; // needs to be smaller than MAX_SIZE
        
        void draw(int i) {
            if(i < MAX_SIZE) size=i; 
        }
        
        void assign(char symbol, i, j)
        {
            char one[i][j] = symbol;
        }
        
        void display()
        {
            for(int i=0; i<size; i++) {
                for(int j=0; i<size; j++) {
                    cout<<one[i][j];
                }
                cout<<endl;
            }
        }
        

        【讨论】:

        • 这不起作用,因为“one”数组是在assign中本地分配的。您没有在任何地方使用相同的“一个”数组。你必须在任何地方传递它。
        【解决方案6】:

        您是否尝试过在函数之外但在文件中定义数组?
        例如:

        static unsigned int my_array[16][32];
        void my_func()
        {
            /*...*/
        }
        
        int another_func()
        {
          /*...*/
        }
        

        【讨论】:

          猜你喜欢
          • 2022-11-12
          • 1970-01-01
          • 1970-01-01
          • 2021-06-21
          • 2013-08-12
          • 2018-10-09
          • 2016-10-13
          • 2013-11-11
          • 1970-01-01
          相关资源
          最近更新 更多