C 初学者 - struct 中的字符串不需要 Malloc

问题描述 投票:0回答:0

为什么结构体中的字符串不需要调用 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?
c struct malloc c-strings
© www.soinside.com 2019 - 2024. All rights reserved.