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