C 使用动态内存分配返回指向结构的指针
我试图返回一个指向我创建的新结构的指针,但我遇到了一个分段错误,不确定如何以正确的方式执行此操作 这就是我现在正在使用的:C 使用动态内存分配返回指向结构的指针,c,pointers,struct,segmentation-fault,malloc,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);
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);
}
我是否应该拨打免费电话(*x)?我是否也应该拨打free(x->name)
你本想写的
Person *x = malloc(sizeof(*x));
sizeof x==sizeof(Person*)
,因此您只为指针分配了足够的内存。您的下一个SEGFULT将(可能)在这条线上:
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 *x = malloc(sizeof(*x));
sizeof x==sizeof(Person*)
,因此您只为指针分配了足够的内存。您的下一个SEGFULT将(可能)在这条线上:
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 *x = malloc(sizeof(*x));
sizeof x==sizeof(Person*)
,因此您只为指针分配了足够的内存。您的下一个SEGFULT将(可能)在这条线上:
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 *x = malloc(sizeof(*x));
sizeof x==sizeof(Person*)
,因此您只为指针分配了足够的内存。您的下一个SEGFULT将(可能)在这条线上:
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以及它的指针(即名称)分配空间。另一方面,即使这个人得到了分配,其姓名部分也将保持未分配状态 备选案文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(具有固定静态分配的名称部分):
您需要为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(具有固定静态分配的名称部分):
您需要为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(具有固定静态分配的名称部分):
您需要为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(具有固定静态分配的名称部分):
啊,谢谢你,我正在学习的帖子从来没有为这个名字分配过内存,所以我认为这是没有必要的。我用另一个问题更新了OP,如果你能给我指出正确的方向,那将是最有帮助的。出于某种原因,我在这里发布了,试图fix@EdS.是否也需要为
x->name
分配内存。。?相反,我们可以尝试像x->name=name
(在参数中分配字符串地址而不使用const
)。可能吗?Person*x=malloc(sizeof(*x))将为指向Person的指针分配内存,而不是Person本身。op不想分配给个人吗?@RavichandraSutrave:不,不会的。它将分配sizeof*x
字节,即sizeof Person
。你把它倒过来了。啊,谢谢你,我学习的帖子从来没有为这个名字分配过内存,所以我认为这是没有必要的。我用另一个问题更新了OP,如果你能给我指出正确的方向,那将是最有帮助的。出于某种原因,我在这里发布了,试图fix@EdS.是否也需要为x->name
分配内存。。?相反,我们可以尝试像x->name=name
(在参数中分配字符串地址而不使用const
)。可能吗?Person*x=malloc(sizeof(*x))将为指向Person的指针分配内存,而不是Person本身。op不想分配给个人吗?@RavichandraSutrave:不,不会的。它将分配sizeof*x
字节,即sizeof Person
。你把它倒过来了。啊,谢谢你,我学习的帖子从来没有为这个名字分配过内存,所以我认为这是没有必要的。我用另一个问题更新了OP,如果你能给我指出正确的方向,那将是最有帮助的。出于某种原因,我在这里发布了,试图fix@EdS.是否也需要为x->name
分配内存。。?相反,我们可以尝试像x->name=name
(在参数中分配字符串地址而不使用const
)。可能吗?Person*x=malloc(sizeof(*x))将为指向Person的指针分配内存,而不是Person本身。op不想分配给个人吗?@RavichandraSutrave:不,不会的。它将分配sizeof*x
字节,即sizeof Person
。你把它倒过来了。啊,谢谢你,我学习的帖子从来没有为这个名字分配过内存,所以我认为这是没有必要的。我用另一个问题更新了OP,如果你能给我指出正确的方向,那将是最有帮助的。出于某种原因,我在这里发布了,试图fix@EdS.是否也需要为x->name
分配内存。。?相反,我们可以尝试像x->name=name
(在参数中分配字符串地址而不使用const
)。可能吗?Person*x=malloc(sizeof(*x))将为指向Person的指针分配内存,而不是Person本身。op不想分配给个人吗?@RavichandraSutrave:不,是的