这段代码有什么作用?内存分配

时间:2015-01-08 14:43:14

标签: c memory memory-management

有人可以帮助我更好地了解内存分配的工作原理吗?如果有人可以一步一步地(希望用图片)经历这段代码中发生的事情,我将不胜感激:

char a[3][4] = {"xy", "abcd", "!?"};
char (*b)[4], *c;
b = a + 1;
c = *a + 1;

我环顾四周,但没有发现任何解释,谢谢!

编辑: 如果有人可以使用内存块解释它,我将不胜感激,例如,[x] [y] [] [a] [b] [c] [d] []

3 个答案:

答案 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)

变量achar的数组数组。变量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]