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

时间:2014-10-13 04:11:18

标签: c pointers struct segmentation-fault malloc

我正在尝试返回指向我创建的新结构的指针,但是我遇到了分段错误,并且不确定如何以正确的方式执行此操作。

这就是我现在正在使用的:

 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)

2 个答案:

答案 0 :(得分:2)

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;
} 

答案 1 :(得分:1)

你需要为Person以及它的指针分配空间,即名称。 Othertwise,即使是人员获得分配,它的名称部分仍然是未分配的。

选项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;
}