图片可以提供帮助 — 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" };
并且您将拥有与 2D 数组图中所示相同的内存布局(除了 x 将被归零)。