图片可以提供帮助 — ASCII 艺术很有趣(但很费力)。
char *stuff[] = {"hello","pie","deadbeef"};
+----------+ +---------+
| stuff[0] |--------->| hello\0 |
+----------+ +---------+ +-------+
| stuff[1] |-------------------------->| pie\0 |
+----------+ +------------+ +-------+
| stuff[2] |--------->| deadbeef\0 |
+----------+ +------------+
为一维指针数组分配的内存是连续的,但不能保证数组中保存的指针指向连续的内存部分(这就是指针行长度不同的原因)。
char stuff[3][9];
strcpy(stuff[0], "hello");
strcpy(stuff[1], "pie");
strcpy(stuff[2], "deadbeef");
+---+---+---+---+---+---+---+---+---+
| h | e | l | l | o | \0| x | x | x |
+---+---+---+---+---+---+---+---+---+
| p | i | e | \0| x | x | x | x | x |
+---+---+---+---+---+---+---+---+---+
| d | e | a | d | b | e | e | f | \0|
+---+---+---+---+---+---+---+---+---+
为二维数组分配的内存是连续的。 x 表示未初始化的字节。注意stuff[0]是指向'hello'的'h'的指针,stuff[1]是指向'pie'的'p'的指针,stuff[2]是指向'deadbeef'的第一个'd'的指针' (并且stuff[3] 是一个不可取消引用的指针,指向 'deadbeef' 之后的空字节之外的字节)。
图片很不一样。
请注意,您可以编写以下任何一种:
char stuff[3][9] = { "hello", "pie", "deadbeef" };
char stuff[][9] = { "hello", "pie", "deadbeef" };
您将拥有与二维数组图中所示相同的内存布局(除了 x 将被归零)。