c-使用动态内存分配返回指向结构的指针



我试图返回一个指向我创建的新结构的指针,但我遇到了分段错误,不确定如何以正确的方式执行。

这就是我现在使用的:

 typedef struct person{
  int age;
  char *name;
 }Person;
 Person *new_person(int age, const char *name){
  Person *x = malloc(sizeof(x));
  x->age = age;
  strcpy(x->name, name);
  return x;
 }

我一直在调整我在网上找到的教程/其他问题中的代码。但我似乎不明白我做错了什么,无论是分配内存的方式还是返回指针的方式。

我遇到的另一个问题是释放与某个人的任何关联内存。假设我想删除一个人,并释放与该人动态关联的任何内存。我搜索了一下,它说我应该使用free方法。但我仍然会有内存泄漏。我有这样的设置:

void kill_person(Person *x){
    free(x->name);
    free(x);
}

我应该打free(*x)吗?我应该也打电话给free(x->name)吗?

Person *x = malloc(sizeof(x));

你想写

Person *x = malloc(sizeof(*x));

sizeof x == sizeof(Person*),所以您只为一个指针分配了足够的内存。你的下一个segfault将(可能)在这条线上:

strcpy(x->name, name);

您从未分配过x->name。一个合适的功能是:

Person *new_person(int age, const char *name) {
    Person *x = malloc(sizeof *x);
    x->name = malloc(strlen(name) + 1);
    x->age = age;
    strcpy(x->name, name);
    return x;
} 

您需要为Person及其指针(即名称)分配空间。另一方面,即使Person被分配,它的名称部分也将保持未分配状态。

选项1:

typedef struct person{
  int age;
  char *name;
 }Person;
Person *new_person(int age, const char *name){
  Person *x = (Person *) malloc(sizeof(Person));
  if (name != NULL) {
      x->name = (char *) malloc(strlen(name) + 1);
  }
  x->age = age;
  strcpy(x->name, name);
  return x;
 }
void kill_person(Person *x){
    free(x->name);
    free(x);
}
int main() {
  Person *p = new_person(28, "Neel Lohit");
  // code to use p, when done, call kill_person
  kill_person(p);
  return 0;
}

选项2(具有固定静态分配的名称部分):

#define MAX_SZ 100
typedef struct person{
  int age;
  char name[MAX_SZ+1];
 }Person;
Person *new_person(int age, const char *name){
  Person *x = (Person *) malloc(sizeof(Person));
  x->age = age;
  strcpy(x->name, name);
  return x;
 }
void kill_person(Person *x){
    free(x);
}
int main() {
  Person *p = new_person(28, "Neel Lohit");
  // code to use p, when done, call kill_person
  kill_person(p);
  return 0;
}

相关内容

  • 没有找到相关文章

最新更新