[英]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-1
和0 <= 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數組,但是您有解決此問題的方法。 您在這里有兩個選擇:
您可以模擬第二維; 我建議為此目的使用一個輔助函數,例如:
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);
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 ++中的多維容器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.