如何在C中分配连续的2D字符串数组

时间:2016-11-12 21:52:50

标签: c arrays string malloc 2d

我是整个C编程的新手(来自Java),老实说它真的很混乱。好的问题我正在尝试为我的2D字符串数组分配重要的数据块(猜猜它类似于3D数组?)。我所拥有的只是我相信对字符串数组的连续分配? 有人可以帮我解决2D阵列吗?

是的,我在运行程序之前知道大小,它定义为行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;

3 个答案:

答案 0 :(得分:1)

如果在运行程序之前确实知道数组的大小,则不需要使用malloc以dinamically方式分配内存,您可以创建2D静态数组。在您的情况下,因为它是一个2D字符串数组,它可以声明为char * array[ROWS][COLS],然后您可以通过这种方式将字符串指定给特定元素:array[nrow][ncol]="Your String"

答案 1 :(得分:1)

与Java不同,C实际上具有多维数组的概念;所以,除非您想要char * * *的特定原因,否则您可能更愿意写:

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

people设置为指向第一个ROWS动态分配的二维字符数组的指针。

由于指针&#34; decay&#34;,其中数组类型的表达式将作为指向数组第一个元素的指针加倍,您可以非常使用people,就像它是{ {1}};例如,char * * *将指向第3行第4列中的字符串。唯一的限制是,您无法编写类似people[3][4]的内容以突然更改内容字符串指向。但听起来你不想这样做,无论如何?

注意:以上假设您有意使用动态内存分配。但是,我建议您考虑Sizigia建议使用静态内存,这与用于全局变量的存储方式相同。如果你写了像

这样的东西
people[3][4] = ...

然后内存将在程序开始时只分配一次,并由声明它的函数的所有调用重用。

答案 2 :(得分:0)

您可以使用char *定义typedef,以便您更好地理解代码。然后,您所要做的就是动态分配您定义类型的2D数组(在下面的示例中,我将其定义为&#34;字符串&#34;):

 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]访问它。