我正在尝试编写一个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 元素数组?)
答案 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数组。
对于第一个唯一指针,它们指向的字符串文字可以存储在只读部分中。第二个是在自动存储(通常是堆栈)上分配的。