我发现以下示例:
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->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
关于c - C动态内存分配如何工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36959592/