我对整个 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"
。
C 与 Java 不同,实际上有多维数组的概念;因此,除非有特定原因您想要
char * * *
,否则您可能更喜欢写:
char (*people)[COLS][NAME] = malloc(ROWS * sizeof(*people));
将
people
设置为指向第一个 ROWS
动态分配的二维字符数组的指针。
由于指针“衰减”,数组类型的表达式将兼作指向数组第一个元素的指针,因此您可以像使用
people
一样使用 char * * *
;例如, people[3][4]
将指向第 3 行第 4 列中的字符串。唯一的限制是您不能 编写类似 people[3][4] = ...
的内容来突然更改要指向的字符串。但听起来你无论如何都不想这样做?
注意:上面假设您有意使用动态内存分配。但是,我确实建议您考虑 Sizigia 使用静态内存的建议,静态内存与用于全局变量的存储类型相同。如果你写类似的东西
static char people[ROWS][COLS][NAME];
那么内存将在程序开始时仅分配一次,并由对声明它的函数的所有调用重用。
您可以使用
char *
定义 typedef
,这样您可以更好地理解代码。然后您所要做的就是动态分配您定义类型的二维数组(在下面的示例中,我将其定义为“字符串”):
typedef char * string;
string ** people;
people = malloc(ROWS * sizeof(string));
for(int i = 0; i < ROWS; i++){
people[i] = malloc(COLUMNS * sizeof(char));
}
您可以使用普通数组语法来访问它,
people[i][j]
。
35633333333333333333333333333333356333333333333333333333333333333563333 333333333333333333333333335633333333333333333333333333333356333333333333 333333333333333333563333333333333333333333333333335633333333333333333333 3333333333563333333333333333333333333333335633333333333333333333333333333 356333333333333333333333333333333563333333333333333333333333333335633333 333333333333333333333333356333333333333333333333333333333563333333333333 333333333333333335633333333333333333333333333333356333333333333333333333 333333333563333333333333333333333333333335633333333333333333333333333333