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

时间:2012-12-12 23:39:01

标签: c arrays memory-management multidimensional-array c99

我正在尝试编写一个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 个答案:

答案 0 :(得分:11)

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

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

+----------+          +---------+
| stuff[0] |--------->| hello\0 |
+----------+          +---------+      +-------+
| stuff[1] |-------------------------->| pie\0 |
+----------+          +------------+   +-------+
| stuff[2] |--------->| deadbeef\0 |
+----------+          +------------+

为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|
+---+---+---+---+---+---+---+---+---+

为2D阵列分配的内存是连续的。 x表示未初始化的字节。请注意,stuff[0]是指向'hello'的'h'的指针,stuff[1]是指向'pie'的'p'的指针,stuff[2]是指向第一个'p'的指针'deadbeef'的'd'(和stuff[3]是指向'deadbeef'之后空字节之外的字节的不可解引用的指针。)

这些照片非常不同。

请注意,您可以写下以下任何一种:

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

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

答案 1 :(得分:4)

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

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

  

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

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

我想你想要这个:

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

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

答案 2 :(得分:2)

在第一个例子中,我认为它是一个锯齿状数组

它声明了一个指向char的const指针数组。所以字符串文字可以随意。字符串的长度是数组列的独立

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

答案 3 :(得分:0)

  

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

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

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

char stuff[3][9];

完全不相同。第一个是3个指针的数组,而第二个是2D数组。

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