我发现以下示例:

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))。所以我认为当我给myperson-> name分配“justatestfoobar”时,我就把程序炸了。

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

最佳答案

当你写

 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

关于c - C动态内存分配如何工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36959592/

10-10 20:56