C语言 分配一个新结构用提供的参数初始化它

o0lyfsai  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(110)

我想创建一个结构,其中代表一个人.所以我开始声明一个结构人包含3个字段:- 名字:指向表示名-姓的字符串的指针:指向表示姓名和年龄的字符串的指针:表示年龄的整数。
现在我必须编写一个函数,分配一个新的People结构,并使用所提供参数的副本初始化它。
我的问题是程序总是崩溃。我不太明白如何才能不崩溃地填充结构(这是我学校的在线编译器)。有人能解释并纠正我吗?
这是它的样子:

数组.h:

#ifndef _PEOPLE_H_                                           
#define _PEOPLE_H_                                           
                                             
typedef struct {                                             
    char* firstname;                                             
    char* lastname;                                          
    int age;                                             
} People;                                            
                                             
People* createPeople(char* firstname, char*  lastname, int age);                                             
                                             
#endif

数组.c:

#include "People.h"                                          
People* createPeople(char* firstname, char*  lastname, int age) {                                            
    People people1;                                          
                                             
    people1.firstname = firstname;                                           
    people1.lastname = lastname;                                             
    people1.age = age;                                           
}
ql3eal8s

ql3eal8s1#

不能返回指向局部变量的指针,因为它在函数返回时超出了作用域。这意味着您需要传入Person的示例,或者像这里一样,使用malloc()来动态分配示例。我还对两个字符串调用了strdup(),在本例中它不是必需的。但是createPeople()函数不知道它们所指向的对象何时超出了作用域。小问题,People是复数,但是您只创建了一个Person。

#include <stdlib.h>
#include <string.h>

typedef struct {
    char* firstname;
    char* lastname;
    int age;
} Person;

Person* createPerson(char* firstname, char*  lastname, int age) {
    Person *p = malloc(sizeof *p);
    if(!p) return NULL;
    p->firstname = strdup(firstname);
    p->lastname= strdup(lastname);
    p->age = age;
    return p;
}

int main() {
    Person *p = createPerson("Clark", "Kent", 42);
    free(p->firstname);
    free(p->lastname);
    free(p);
}
fafcakar

fafcakar2#

首先必须包含stdlib.h才能使用mallocfree,然后分配足够的内存来使用malloc保存struct People
如果内存分配失败,则返回NULL
如果内存分配顺利,则分配结构值的每个成员并返回它。

#include "People.h"
#include <stdlib.h>
                                          
People* createPeople(char* firstname, char*  lastname, int age) {                                            
    People *people1 = malloc(sizeof(*people1));
    if (!people1)
         return (NULL);                             
    people1->firstname = firstname;                                           
    people1->lastname = lastname;                                             
    people1->age = age;

   return (people1);                                           
}

相关问题