這個問題的來源參考:Freaky way of allocating 2D array
我使用了參考帖子的答案中顯示的代碼的改編版本來創建一個字串陣列:
char (*string)[rows] = malloc(sizeof(char [rows][cols]));
memset(string, 0, sizeof(char [rows][cols]));
我意識到對于非常大的陣列,這種方法不是最佳的,因為在嘗試分配時,單個大的連續記憶體塊變得非常昂貴。但在創建中小型陣列時,優勢可能很有吸引力。例如。此方法僅使用對malloc(),的一次呼叫來分配單個連續塊記憶體,因此free()在使用完后只需要一次呼叫,使其成為我見過的更慣用方法的理想替代方法。(那些使用多次呼叫malloc()和free(),)
所以,我想把它封裝成一個函式,但到目前為止我還沒有發現什么回傳型別是兼容的:
T CreateStringArray(int rows, int cols)
{
char (*string)[rows] = malloc(sizeof(char [rows][cols]));
memset(string, 0, sizeof(char [rows][cols]));
return T;
}
什么形式T可以與此功能一起使用?
uj5u.com熱心網友回復:
你會想回傳char (*)[rows],但是這是一個可變修飾型別和物件只(而不是函式),在塊或函式原型范圍沒有任何聯系(不像所有功能),可以有可變修飾型別宣告(C17 6.7.6.2/2 )。
因此,您可以為函式的回傳型別做的最好的事情是char *or void *。
但是,您可以使用宏對其進行修補:
void *CreateStringArray_func(int rows, int cols)
{
char (*string)[rows] = malloc(sizeof(char [rows][cols]));
memset(string, 0, sizeof(char [rows][cols]));
return string;
}
#define CreateStringArray(rows, cols) \
((char (*)[rows]) CreateStringArray_func(rows, cols))
但在那種特殊情況下,我可能只會使用
#define CreateStringArray(rows, cols) calloc(rows, cols)
您也可以將強制轉換添加到后者,但我根據不強制轉換分配函式結果的原則省略了它。
uj5u.com熱心網友回復:
你可以嘗試這樣的事情:
void * CreateStringArray(int rows, int cols)
{
char (*string)[cols] = malloc(sizeof(char [rows][cols]));
memset((void*)string, 0, sizeof(char [rows][cols]));
return string;
}
int main()
{
char (*p)[4] = (char (*)[4])CreateStringArray(3, 4);
}
請注意,char (*string)[cols]應使用colsnot定義rows。因為string是一個指向一維cols元素陣列的指標。
延期:
關于為什么使用cols而不是的詳細資訊rows:
使用時,陣列名稱是指向其第一個元素的指標。例如int arr[5],這里arr有一個指向a[0].
雖然int a[rows][cols],這里a不apointer來a[0][0]代替它的是一個指標,它a[0]具有型別int (*)[cols]
要理解這一點,您必須考慮 C 如何在記憶體中存盤多維陣列?它實際上是逐行存盤為一維陣列。
例如int a[2][3] = {{1, 2, 3}, {4, 5, 6}};被存盤為1 2 3 4 5 6,這里a[0]是{1, 2, 3}一個指向是一個指標的指標a[0],{1, 2, 3}它是一個指向一個由 3 個整陣列成的陣列的指標,可以寫成int (*)[3]=> 通常它是 `int (*) [cols]'
uj5u.com熱心網友回復:
如果我理解正確,函式應該回傳函式內分配的指標,
指標具有型別,char (*)[cols] 但在宣告函式時,函式的回傳型別對變數 cols 一無所知。
在這種情況下,函式應該被宣告為
void * CreateStringArray(int rows, int cols) )
{
char (*string)[rows] = malloc(sizeof(char [rows][cols]));
memset(string, 0, sizeof(char [rows][cols]));
return string;
}
在呼叫者中你可以寫
char ( *string )[cols] = CreateStringArray( rows, cols );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341537.html
上一篇:text[i]的資料型別是什么?
