簡體   English   中英

如何在C中分配字符串的連續2D數組

[英]How to allocate contiguous 2D array of strings in C

我是整個C編程(來自Java)領域的新手,老實說,它確實令人困惑。 好的問題,我正在嘗試為我的2D字符串數組分配連續的數據塊(猜測像3D數組之類的東西?)。 我所擁有的就是我相信字符串數組的連續分配嗎? 有人可以幫我解決二維陣列嗎?

是的,我在運行該程序之前就知道了大小,它的定義是行為ROWS,行為COLS,字符串長度為NAME。

char **people = malloc(COLS * sizeof(char *));

people[0] = malloc(COLS * NAME);
for(int i = 1; i < COLS; i++)
    people[i] = people[0] + i * NAME;

如果您在運行程序之前真正了解數組的大小,則無需使用malloc動態分配內存,則可以創建2D靜態數組。 在您的情況下,由於它是2D字符串數組,因此可以將其聲明為char * array[ROWS][COLS] ,然后可以通過以下方式將字符串分配給特定元素: array[nrow][ncol]="Your String"

與Java不同,C實際上具有多維數組的概念。 因此,除非有特殊原因,您想要一個char * * * ,否則您可能更喜歡這樣寫:

char (*people)[COLS][NAME] = malloc(ROWS * sizeof(*people));

這使people成為ROWS動態分配的二維字符數組中第一個的指針。

由於指針“ decay”,數組類型的表達式將作為指向數組第一個元素的指針加倍,因此您可以像使用char * * *一樣使用很多people 例如, people[3][4]將指向第3行第4列中的字符串。唯一的限制是您不能編寫諸如people[3][4] = ...來突然更改什么字符串指向。 但是聽起來您還是不想這樣做嗎?


注意:以上假設是您有意使用動態內存分配。 但是,我確實建議您考慮使用Sizigia的建議使用靜態內存,該內存與用於全局變量的存儲類型相同。 如果你寫類似

static char people[ROWS][COLS][NAME];

那么該內存將在程序開始時僅分配一次,並由聲明該函數的所有調用重用。

您可以使用typedef定義char *以便更好地理解代碼。 然后,您要做的就是動態分配您定義的類型的2D數組(在下面的示例中,我將其定義為“字符串”):

 typedef char * string;
 string ** people;
 people = malloc(ROWS * sizeof(string));
 for(int i = 0; i < ROWS; i++){
    people[i] = malloc(COLUMNS * sizeof(char));
 }

您可以使用常規數組sintax people[i][j]來訪問它。

暫無
暫無

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

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