我正在尝试返回指向我创建的新结构的指针,但是我遇到了分段错误,并且不确定如何以正确的方式执行此操作。
这就是我现在正在使用的:
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)
?
答案 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;
}