C动态内存分配如何工作

Knt*_*lii 2 c malloc pointers dynamic-memory-allocation

我找到了以下示例:

typedef struct {
    char * name;
    char age;
} person;

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

myperson->name = "John";
myperson->age = 27;
Run Code Online (Sandbox Code Playgroud)

(http://www.learn-c.org/en/Dynamic_allocation)

我想我在这个例子中分配了8个字节(sizeof(人)).因此,当我将"justatestfoobar"分配给myperson-> name时,我认为我炸毁了程序...

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

Sou*_*osh 5

当你写作

 person * myperson = malloc(sizeof(person));
Run Code Online (Sandbox Code Playgroud)

它分配存储器的myperson变量(指针),即,用于myperson->namemyperson->age构件变量本身.

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

跟随那个,

 myperson->name = "John";
Run Code Online (Sandbox Code Playgroud)

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

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

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