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

What does this code do? Memory-allocation

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

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

我环顾四周,但没有找到任何可以彻底解释这一点的内容,谢谢!

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

#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 答案。

变量achar数组的数组。变量b是指向char数组的指针,c是指向`char.

的指针

变量a在声明时初始化。然后变量b赋值指向asecond数组(即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].

char a[3][4] = {"xy", "abcd", "!?"};

第一个命令在堆栈上分配一个 3 x 4 矩阵,并用一些字符初始化二维数组的元素。

char (*b)[4], *c;

在堆栈上保留一个指向名为 b 的大小为 4 的字符数组的指针。此外,它还创建了第二个名为 c.

的字符指针
b = a + 1;

你在指针 b 中存储了数组 a + 1 的起始地址,这意味着第二个元素(第二行 4 个字符)的地址。

c = *a + 1;

您取消引用 a,生成指向 a 的第一个元素的指针(a 的一个元素是大小为 4 的字符数组),并将 1 添加到该指针 - 那是第一个条目的第二个字母。