簡體   English   中英

在C中創建未知大小的全局2D數組

[英]Creating a global 2D array of unknown size in C

我正在嘗試在C中創建一個整數的全局2D數組,但是我不確定如何執行此操作。 對於一維數組,您可以簡單地將

int numbers[];

但顯然您不能像這樣將兩個括號留空

int numbers[][];

那我該怎么辦呢? 我不確定一個簡單的方法。

謝謝!

為了構造2D數組,我們的想法是創建一個扁平的2D數組 (因此是1D數組) 實際上,這意味着所有列將水平放置,一個接一個。 您將需要計算索引才能訪問元素。

假設您的數組將具有N行和M列。 您不能將其聲明為:

int numbers[N][M];

您可以做的是將其聲明為:

int numbers[N*M];

因此您的元素將在[0,N * M-1]范圍內。 然后,您可以使用index訪問數組的任何元素:

i*M + j;       

其中0 <= i <= N-10 <= j <= M-1


但是,鑒於大小未知,我建議您使用動態內存分配而不是2D數組。 您可以按照以下步驟進行操作。 首先,聲明一個指向pointer的指針 ,該指針實際上將是2D數組第一個元素的指針:

int **numbers;

然后,為2D結構分配內存:

int i;
numbers = malloc( N*sizeof(int *) );        // N is the number of the rows
if (numbers == NULL)
    return;
for (i = 0 ; i < N ; i++)
{
    numbers[i] = malloc( M*sizeof(int) );     // M is the number of the columns
    if (numbers[i] == NULL)
        return;
}

您可以在此處閱讀有關2D數組動態內存分配的更多信息,以了解內存中發生的情況。


最后,根據您的問題,讓我注意到您無法聲明:

int numbers[]; 

因為編譯器需要一個指示來知道大小。

為此,您將需要一個指向int的指針。 C沒有普通的2D數組,但是您有解決此問題的方法。 您在這里有兩個選擇:

通過輔助函數模擬2D數組

您可以模擬第二維; 我建議為此目的使用一個輔助函數,例如:

int getTwoDimensionArray(int ** array, int rowSize, int x, int y)
{
  return (*array)[x + y*rowSize];
}

void setTwoDimensionArray(int ** array, int rowSize, int x, int y, int value)
{
  (*array)[x + y*rowSize] = value;
}

假設您要動態分配5x7數組,可以使用如下函數:

首先分配一維數組

int * myArray = (int*) malloc(5*7);

之后,您將像 setTwoDimensionArray(&myArray,5,2,2,10); 那樣在位置x = 2,y = 2處設置值為 10。

然后,如果您想取回值: int value = getTwoDimensionArray(&myArray,5,2,2);

有一個數組數組,以便模擬2D數組

int getTwoDimensionArray(int ** array, int rowSize, int x, int y)
{
  return (*array)[x][y];
}

void setTwoDimensionArray(int ** array, int rowSize, int x, int y, int value)
{
  (*array)[x][y] = value;
}

分配數組的數組:

int ** myArray = (int**) malloc(5);
for ( int i=0; i<5; ++i )
{
  myArray[i] = (int*) malloc(7);
}

您將以與選項#1相同的方式使用輔助功能。

setTwoDimensionArray(&myArray, 5, 2, 2, 10);
int value = getTwoDimensionArray(&myArray, 5, 2, 2);

C ++

當然,如果可以使用C ++,則有更多選擇,請參閱C ++中的多維容器

暫無
暫無

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

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