Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用动态内存分配返回指向结构的指针_C_Pointers_Struct_Segmentation Fault_Malloc - Fatal编程技术网

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:不,是的