有人可以帮助我更好地了解内存分配的工作原理吗?如果有人可以一步一步地(希望用图片)经历这段代码中发生的事情,我将不胜感激:
char a[3][4] = {"xy", "abcd", "!?"};
char (*b)[4], *c;
b = a + 1;
c = *a + 1;
我环顾四周,但没有发现任何解释,谢谢!
编辑: 如果有人可以使用内存块解释它,我将不胜感激,例如,[x] [y] [] [a] [b] [c] [d] []
答案 0 :(得分:2)
char a[3][4] = {"xy", "abcd", "!?"};
第一个命令在堆栈上分配一个3乘4的矩阵,并用一些字符初始化二维数组的元素。
char (*b)[4], *c;
保留指向堆栈上名为b的字符数组4的指针。另外,它创建了一个名为c。
的第二个char指针b = a + 1;
在指针b中存储数组a + 1的起始地址,表示第二个元素的地址(第4行的第2行)。
c = *a + 1;
你取消引用a,产生指向a的第一个元素的指针(a的一个元素是一个大小为4的char数组),并向该指针添加1 - 即第一个条目的第二个字母。
答案 1 :(得分:1)
#include <stdio.h>
int main(int argc, char *argv[])
{
// the second dimension should 5
// since "abcd" is 4 chars + null terminator
char a[3][5] = {"xy", "abcd", "!?"};
char (*b)[5], *c;
b = a + 1;
c = *a + 1;
// b = a + 1, thus it points to the second entry of a array
printf("%s\n", b[0]);
// c = *a + 1, thus it points where a points to, plus one,
// thus in the second letter of a's first entry
printf("%c\n", *c);
return 0;
}
编辑您的编辑
a -> [x][y][0][0][0][a][b][c][d][0][!][?][0][0][0]
b -> [a][b][c][d][0][!][?][0][0][0]
c -> [y]
使用零,我代表空终止符。请注意,在您的示例中,拥有一个并不重要,但我认为在C中使用空终止字符串总是一件好事。这就是我改变代码的原因。
为什么a
中每个字符串只有1个空终结符?请参阅this回答。
答案 2 :(得分:0)
变量a
是char
的数组数组。变量b
是指向char
数组的指针,c
是指向`char。
变量a
在声明时初始化。然后将变量b
指定为指向a
的第二个数组(即a[1]
),并将c
指定给第二个字母a[0]
。
至于b
的分配,表达式a[1]
和*(a + 1)
是等效的。
对于c
的赋值,a
本身就是指向数组第一个元素的指针,即它是指针a[0]
(a
是与&a[0]
相同。取消引用a
即可获得a
的第一个条目,即获得a[0]
。向a[0]
添加一个字符会为您提供a[0]
的第二个字符,即a[0][1]
。