[英]How can i use dynamic 2d array in c
我試着制作一個動態的5x5 int數組
int **data=malloc(5*5);
但是在嘗試訪問它時會出現分段錯誤。
你需要為你想要制作的2d陣列分配內存(我認為你理解)。 但首先,您必須為指針存儲2D數組的行分配空間。
int **data=(int**)malloc(sizeof(*data)*5); //Here 5 is the number of rows
現在,您可以為每行分配空間。
for(int r=0;r<5;r++){
data[r]=(int*)malloc(sizeof(**data)*5);//here 5 is the width of the array
}
如果你想要整個數組的連續內存塊,你可以分配一個大小為25的單維數組,並像data[r*5+c]
一樣訪問它。
PS:您可以使用sizeof(int*)
和sizeof(int)
來代替sizeof(*data)
和sizeof(**data)
,以避免與*
混淆
PS:如果你沒有使用C ++,那么從malloc的返回值中刪除強制轉換更好(參見注釋)。
如果你想要一個連續的內存塊來保存5x5 = 25個整數:
int *data = malloc(5*5*sizeof(*data));
如果你想要一個大小為5x5的二維數組
int **data = malloc(5*sizeof(*data));
for (int i=0; i<5; ++i)
data[i] = malloc(5*sizeof(**data));
有兩種可能性。 第一個確實要分配一個二維數組:
int ( *data )[5] = malloc( 5 * 5 * sizeof( int ) );
在這種情況下,為陣列分配一個連續的范圍。
第二個是首先分配一維指針數組,然后分配已經分配的指針所指向的一維數組。
例如
int **data = malloc( 5 * sizeof( int * ) );
for ( size_t i = 0; i < 5; i++ )
{
data[i] = malloc( 5 * sizeof( int ) );
}
在這種情況下,實際上分配了6個內存區:一個用於指針數組,另外一個用於整數數組。
要在第一個示例中釋放已分配的內存,寫入就足夠了
free( data );
在第二個例子中,您需要編寫以下內容
for ( size_t i = 0; i < 5; i++ ) free( data[i] );
free( data );
如果要將數組視為2D數組( a[i][j]
) 並且希望所有數組元素在內存中是連續的,請執行以下操作:
int (*data)[5] = malloc( sizeof *data * 5 );
如果您還希望成為表以在運行時確定數組的大小, 並且您的編譯器支持可變長度數組1 :
size_t rows, cols;
...
int (*data)[rows] = malloc( sizeof *data * cols );2
如果你的編譯器不支持沃拉斯,你還是要在運行時確定數組的大小,你會怎么做:
size_t rows, cols;
...
int **data = malloc( sizeof *data * rows );
if ( data )
{
for ( size_t i = 0; i < rows; i++ )
{
data[i] = malloc( sizeof *data[i] * cols );
}
}
這種方法的缺點是數組的行不保證在內存中是連續的(它們很可能不會)。 單個行內的元件將是連續的,但行不會彼此鄰近。
如果要在運行時確定數組大小並使所有數組元素在內存中連續但編譯器不支持可變長度數組,則需要分配一維數組並手動計算索引( a[i * rows + j]
):
int *data = malloc( sizeof *data * rows * cols );
__STDC_NO_VLA__
應該支持沃拉斯。
sizeof *data
是否定義良好存在一些問題;
sizeof
表達式通常在編譯時計算,但是當操作數是VLA時,表達式在運行時計算。
data
尚未指向任何內容,並且嘗試取消引用無效指針會導致未定義的行為。
我可以說的是,我已經習慣了很多這個習慣用語而且沒有問題,但這可能更多是因為運氣不好而不是設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.