4

struct があるとしましょう:

struct Person {
    char *name;
};

struct Person *Person_create(char *name){
  struct Person *who = malloc(sizeof(struct Person));
  assert(who != NULL);
  who->name = strdup(name);
  return who;
}

void Person_destroy(struct Person *who){
  assert(who != NULL);
  free(who->name);
  free(who);
}

そして主な機能:

  int main(int argc,char *argv[]){

  struct Person *mike = Person_create("mike");
  Person_print(mike);
  Person_destroy(mike);

  return 0;
}

上記のコードは、strdup() 関数がないと正しく動作しません。Valgrind は、free(who->name) で解放しようとしているアドレスは malloc されていないと言っています。この背後にある話は何ですか。構造体を malloc したときに、そのメモリを malloc しませんでしたか? そして、strdup() はどのような違いを生むのでしょうか?

4

3 に答える 3