为什么结构体中的字符串不需要调用 Malloc?
嗨,这周我刚开始学习 C,我发现了一个我无法解释的奇怪的不一致之处。
据我所知,当函数结束时,“堆栈”中分配的项目将从内存中删除。如果我们希望变量在这个时间之后持续更长时间(当作用域结束时),我们使用 malloc。
这对于结构来说完全有意义并且是一致的。如果您创建一个结构体,然后尝试打印它所创建的函数范围之外的值 - 除非您对该结构体进行 malloc,否则将导致错误。
但是,我发现如果我尝试创建一个结构体并使用默认值(结构体的大小)分配它,然后添加一个字符指针(字符串)作为结构体成员,它会接收该值并且不会出现错误当尝试打印它时 - 我想我需要在结构成员本身上调用 malloc,然后将字符串复制到其中?
知道这里发生了什么吗?
这会毫无问题地打印结构成员。
typedef struct person {
char *name;
} person;
// print struct fields
void print_person(person *input) { printf("Name: %s", input->name); }
person *person_generator(char *name) {
my_struct *person = malloc(sizeof(my_struct));
// assign given char pointer to struct field
person->name = name;
return person;
}
person *create_default_person() {
person *new_person = person_generator("Alfred Hitchcock");
return new_person;
}
int main() {
person *default_person = create_default_person();
print_person(default_person);
return 0;
}
我很困惑为什么下面的代码不是强制性的?
typedef struct person {
char *name;
} person;
// print struct fields
void print_person(person *input) { printf("Name: %s", input->name); }
person *person_generator(char *name) {
my_struct *person = malloc(sizeof(my_struct));
// didnt need to do this?
person->name = malloc(strlen(name) + 1);
strcpy(person->name, name);
return person;
}
char *get_string() {
char *item = "Alfred Hitchcock";
return item;
}
person *create_default_person() {
char *value = get_string();
person *new_person = person_generator(value);
return new_person;
}
int main() {
person *default_person = create_default_person();
print_person(default_person);
return 0;
}```
I am expecting when "create_default_person()" function ends, the pointer it created is destroyed from the stack its inside of, then the struct member should be pointing to garbage data right?