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->namemyperson->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