在不使用动态内存分配的情况下声明可变大小的数组

时间:2012-10-22 19:28:47

标签: c++ dynamic scope

我想在函数中分配可变大小的2D数组而不使用new运算符,这样这个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;
        }
    }

功能的执行顺序是 - &gt;分配 - &gt;显示

之前可能已经提出过这个问题。 但我的问题是...... - &GT;我无法在全局分配函数之外声明数组,因为大小的值是未知的。 - &GT;我不能在“display”函数中使用“one”数组,因为它的范围仅限于“assign”函数。

而且我也不想使用new或malloc运算符。 如果有其他选择,请提供帮助。

6 个答案:

答案 0 :(得分:4)

C ++不支持堆栈分配的可变长度数组,例如C99。您应该使用std::vector<T>代替。如果您真的想使用堆栈分配,可以使用alloca()

答案 1 :(得分:2)

没有办法做到这一点。数组“one”在assign函数的堆栈中是临时的。离开assign函数时会被破坏。

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

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

您关注的是表现吗?或者您是否在无法进行内存分配的平台上?

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

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

E.g。

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

答案 2 :(得分:1)

如果您不想使用动态内存分配,则必须支付分配一些额外内存的成本。 您可以将数组的大小定义为足以处理手头的数据。 等,

int arr[my_limit];

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

在问题中提到的程序中,内存需要数组&#39; one&#39;仅在运行时确定,因此使用动态内存分配是一种好习惯。

答案 3 :(得分:0)

我在c ++上并不完美,实际上我是像你这样的新手。但是我认为你可以使用

来做到这一点
"*pointer"

我的意思是你应该展示你的阵列的反抗。然后你可以在函数之外使用它。

答案 4 :(得分:0)

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;
    }
}

答案 5 :(得分:0)

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

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

int another_func()
{
  /*...*/
}