我找到了以下示例:
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 ...
有人可以解释为什么以及如何运作?
答案 0 :(得分:5)
写作时
person * myperson = malloc(sizeof(person));
它为myperson
变量(指针)分配内存,即myperson->name
和myperson->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