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将被置零).
| 归档时间: |
|
| 查看次数: |
1065 次 |
| 最近记录: |