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

4

我想在一个函数中分配变量大小的二维数组,而不使用new运算符,这样这个二维数组就可以在同一个文件中的其他函数中使用。

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

函数的执行顺序是绘制 -> 赋值 -> 显示。

这个问题可能之前已经被问过了。 但我的问题是... -> 我无法在全局中声明数组,因为大小的值是未知的。 -> 我无法在“display”函数中使用“assign”函数中受限于其范围的“one”数组。

我也不想使用new或malloc运算符。如果有其他可用的替代方法,请帮忙解决。


2
std::vector 听起来很完美。 - chris
你是否在乎“new”或“malloc”在幕后被调用的情况? - juanchopanza
std::vector非常适合您的目的。您可以创建一个大小为零的数组,然后使用resize(int size)方法更改其大小。STL提供了其他管理数组/向量的方法。 - bobestm
6个回答

4

C++不支持类似C99那样的堆栈分配变长数组。你应该使用std::vector<T>。如果你真的想使用堆栈分配,可以使用alloca()


我认为你的意思是使用 alloca 而不是 calloc - Pubby
@ThomasMatthews 我的意思是 alloca() - mauve
默认情况下,std::vector<T> 使用动态内存。@Jekin 必须创建一个使用 alloca() 的分配器的 std::vector - Thomas Matthews
@Thomas Matthews2:我很好奇:如何创建可用于std::vector的分配器?alloca在调用者的堆栈帧上分配,这将是在此处使用的allocator :: allocate,并且与声明std::vector时的堆栈帧不同。 - Éric Malenfant

2

无法实现此操作。 数组“one”是在分配函数中堆栈上的临时数组。 每当您离开分配函数时,它都会被销毁。

因此,您需要以某种方式分配内存。

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

您是否担心性能? 还是您在无法进行内存分配的平台上?

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

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

例如:

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

1
如果您不想使用动态内存分配,则必须承担比所需更多的额外内存分配成本。您可以定义数组的大小足够大,以处理手头的数据。例如, int arr [my_limit]; 请注意,my_limit 必须是一个常量表达式。
在问题中提到的程序中,数组“one”的内存需求仅在运行时确定,因此使用动态内存分配是一个好习惯。

0

我并不是C++的专家,实际上和你一样,我也是一个新手。但是我认为你可以通过使用

来完成它。
"*pointer"

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


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

这不起作用,因为“one”数组在assign中是本地分配的。你没有在所有地方使用相同的“one”数组。你必须在每个地方都传递它。 - Rafael Baptista

0

你尝试过在函数外但文件内定义数组吗?
例如:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接