我找到了以下示例:
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))。所以我想当我将“justatestfoobar”分配给 myperson->name...
时,我会炸毁程序有人可以解释一下为什么以及如何工作吗?
最佳答案
当你写的时候
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 动态内存分配如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36959592/