簡體   English   中英

在不使用動態內存分配的情況下聲明可變大小的數組

[英]Declaring variable sized array without using dynamic memory allocation

我想在函數中分配可變大小的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;
        }
    }

函數的執行順序是draw - > assign - > display

之前可能已經提出過這個問題。 但我的問題是.. - >我無法在全局分配函數之外聲明數組,因為大小的值是未知的。 - >我不能在“display”函數中使用“one”數組,因為它的范圍僅限於“assign”函數。

而且我也不想使用new或malloc運算符。 如果有其他選擇,請提供幫助。

C ++不支持堆棧分配的可變長度數組,例如C99。 你應該使用std::vector<T> 如果你真的想使用堆棧分配,你可以使用alloca()

沒有辦法做到這一點。 數組“one”在assign函數的堆棧中是臨時的。 離開assign函數時會被破壞。

所以你需要以某種方式分配內存。

如果您一次只使用“one”數組的一個副本,則可以在全局范圍內聲明它,其空間足夠大以獲得舒適的上限。 並在每次使用它時檢查靜態全局數組是否足夠大。

你擔心表現嗎? 或者您是否在無法進行內存分配的平台上?

其他一些選項:靜態地在系統外部分配數組,並將其作為參數傳遞給每個函數。

或者,如果可以從單個更高級別的“所有者”函數調用所有函數,則可以使用“alloca”在堆棧上動態分配數組。

例如

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

如果您不想使用動態內存分配,則必須支付分配一些額外內存的成本。 您可以將數組的大小定義為足以處理手頭的數據。 喜歡,

int arr[my_limit];

請注意my_limit必須是常量表達式。

在問題中提到的程序中, 數組'one'的內存需求僅在運行時確定 ,因此使用動態內存分配是一種好習慣。

我對c ++並不完美,實際上我是一個像你這樣的新手。 但是我認為你可以通過使用來實現

"*pointer"

我的意思是你應該展示你的陣列的referance。 然后你可以在函數之外使用它。

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

您是否嘗試在函數之外定義數組,但是在文件中?
例如:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM