这段代码有什么作用?内存分配
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 答案。
变量a
是char
数组的数组。变量b
是指向char
数组的指针,c
是指向`char.
的指针
变量a
在声明时初始化。然后变量b
赋值指向a
的second数组(即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 添加到该指针 - 那是第一个条目的第二个字母。
有人可以帮助我更好地了解内存分配的工作原理吗?如果有人可以一步一步(希望有图片)了解这段代码中发生的事情,我将不胜感激:
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 答案。
变量a
是char
数组的数组。变量b
是指向char
数组的指针,c
是指向`char.
变量a
在声明时初始化。然后变量b
赋值指向a
的second数组(即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 添加到该指针 - 那是第一个条目的第二个字母。