如何在C99中为隐式定义的多维数组分配内存?

Vil*_*ray 1 c arrays memory-management c99 multidimensional-array

我正在尝试编写一个C99程序,我有一个隐式定义的字符串数组:

char *stuff[] = {"hello","pie","deadbeef"};
Run Code Online (Sandbox Code Playgroud)

由于未定义数组维度,因此为每个字符串分配了多少内存?是否所有字符串都分配了与定义中最大字符串相同数量的元素?例如,以下代码是否等同于上面的隐式定义:

char stuff[3][9];
strcpy(stuff[0], "hello");
strcpy(stuff[1], "pie");
strcpy(stuff[2], "deadbeef");
Run Code Online (Sandbox Code Playgroud)

或者每个字符串只分配了它在定义时所需的内存量(即stuff[0]包含6个元素stuff[1]的数组,包含4个元素stuff[2]的数组,并包含9个元素的数组)?

Jon*_*ler 12

图片可以提供帮助 - ASCII艺术很有趣(但很费力).

char *stuff[] = {"hello","pie","deadbeef"};

+----------+          +---------+
| stuff[0] |--------->| hello\0 |
+----------+          +---------+      +-------+
| stuff[1] |-------------------------->| pie\0 |
+----------+          +------------+   +-------+
| stuff[2] |--------->| deadbeef\0 |
+----------+          +------------+
Run Code Online (Sandbox Code Playgroud)

为1D指针数组分配的内存是连续的,但不能保证数组中保存的指针指向内存的连续部分(这就是指针线长度不同的原因).

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|
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

为2D阵列分配的内存是连续的.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" };
Run Code Online (Sandbox Code Playgroud)

并且您将具有与2D阵列图中所示相同的存储器布局(除了x将被置零).

  • 只是美丽. (2认同)