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