C 动态内存分配是如何工作的
C How does Dynamic Memory allocation work
我找到了以下示例:
typedef struct {
char * name;
char age;
} person;
person * myperson = malloc(sizeof(person));
myperson->name = "John";
myperson->age = 27;
(http://www.learn-c.org/en/Dynamic_allocation)
我认为我在示例中分配了 8 个字节 (sizeof(person))。所以我想当我将 "justatestfoobar" 分配给 myperson->name...
时我炸毁了程序
有人可以解释为什么以及如何工作吗?
写的时候
person * myperson = malloc(sizeof(person));
它为 myperson
变量(指针)分配内存,即 myperson->name
和 myperson->age
成员变量本身。
myperson->name
(作为指针)指向的内存位置无效,直到时间。换句话说,myperson->name
本身是一个有效的访问,但是当你尝试使用 myperson->name
指向的内存位置的 content 时,它将是UB 作为指针值是不确定的。您需要为指针单独分配内存。
接下来,
myperson->name = "John";
是有效的,因为您将 字符串文字 "John"
的起始地址存储到指针。之后您可以使用 指针内容。 (请记住,由于 myperson->name
指向字符串文字,您不能更改它。)
为了扩展这个答案,让我声明一下,如果你想复制一个字符串到 [=14]指向的内存位置=],那么,首先,你需要先分配内存给myperson->name
。例如,
myperson->name = malloc(32); //allocate memory
strcpy(myperson->name, "Hello"); //write to that memory
我找到了以下示例:
typedef struct {
char * name;
char age;
} person;
person * myperson = malloc(sizeof(person));
myperson->name = "John";
myperson->age = 27;
(http://www.learn-c.org/en/Dynamic_allocation)
我认为我在示例中分配了 8 个字节 (sizeof(person))。所以我想当我将 "justatestfoobar" 分配给 myperson->name...
时我炸毁了程序有人可以解释为什么以及如何工作吗?
写的时候
person * myperson = malloc(sizeof(person));
它为 myperson
变量(指针)分配内存,即 myperson->name
和 myperson->age
成员变量本身。
myperson->name
(作为指针)指向的内存位置无效,直到时间。换句话说,myperson->name
本身是一个有效的访问,但是当你尝试使用 myperson->name
指向的内存位置的 content 时,它将是UB 作为指针值是不确定的。您需要为指针单独分配内存。
接下来,
myperson->name = "John";
是有效的,因为您将 字符串文字 "John"
的起始地址存储到指针。之后您可以使用 指针内容。 (请记住,由于 myperson->name
指向字符串文字,您不能更改它。)
为了扩展这个答案,让我声明一下,如果你想复制一个字符串到 [=14]指向的内存位置=],那么,首先,你需要先分配内存给myperson->name
。例如,
myperson->name = malloc(32); //allocate memory
strcpy(myperson->name, "Hello"); //write to that memory