如何在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个元素)?

图片可以提供帮助 – 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| +---+---+---+---+---+---+---+---+---+ 

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

这些照片非常不同。

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

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

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

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

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

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

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

我想你想要这个:

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

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

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

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

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

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

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

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

 char stuff[3][9]; 

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

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