C动态内存分配如何工作

时间:2016-04-30 19:59:38

标签: c pointers malloc dynamic-memory-allocation

我找到了以下示例:

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(人))。因此,当我分配" justatestfoobar"到myperson-> name ...

有人可以解释为什么以及如何运作?

1 个答案:

答案 0 :(得分:5)

写作时

 person * myperson = malloc(sizeof(person));

它为myperson变量(指针)分配内存,即myperson->namemyperson->age成员变量本身。

myperson->name(作为指针)指向的内存位置无效,直到时间。换句话说,myperson->name本身是有效的访问权限,但是当您尝试使用myperson->name指向的内存位置的内容时,它就是UB因为指针值是不确定的。您需要分别为指针分配内存。

之后,

 myperson->name = "John";

有效,因为您将字符串文字 "John"的起始地址存储到指针中。在此之后,您可以使用指针内容。 (请记住,当myperson->name指向字符串文字时,您可能无法更改它。)

为了扩展这个答案,让我说一下,如果你想 一个字符串复制到 myperson->name指向的内存位置,那么,首先,你需要先将内存分配给myperson->name。例如,

 myperson->name  = malloc(32);    //allocate memory 
 strcpy(myperson->name, "Hello");  //write to that memory