1

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

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

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

char stuff[3][9];
strcpy(stuff[0], "hello");
strcpy(stuff[1], "pie");
strcpy(stuff[2], "deadbeef");

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

4

4 回答 4

12

图片可以提供帮助 — 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 将被归零)。

于 2012-12-12T23:54:33.657 回答
4
char *stuff[] = {"hello","pie","deadbeef"};

不是多维数组!它只是一个指针数组。

为每个字符串分配多少内存?

字符数加上空终止符。与任何字符串文字相同。

我想你想要这个:

char foo[][10] = {"hello","pie","deadbeef"};

这里,10 是每个字符串的空间量,所有字符串都在连续的内存中。因此,小于 10 的字符串会有填充。

于 2012-12-12T23:43:14.180 回答
2

在第一个示例中,我想它是一个锯齿状数组。

它声明了一个指向 char 的 const 指针数组。所以字符串文字可以是任意长的。字符串的长度与数组列无关

在第二个中.. 每行 ( string) 长度的字符数必须为 9,由您的列大小指定,或者更少。

于 2012-12-12T23:41:46.877 回答
0

是否所有字符串都分配了与定义中最大字符串相同数量的元素?

不,只分配了 3 个指针,它们指向 3 个字符串文字。

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

char stuff[3][9];

根本不等价。第一个是 3 个指针的数组,而第二个是 2D 数组。

对于第一个唯一的指针被分配并且它们指向的字符串文字可以存储在只读部分中。第二个分配在自动存储(通常是堆栈)上。

于 2012-12-12T23:42:43.147 回答