第二个printf与我的第一个printf相同,使程序崩溃

myt*_*nis 0 c malloc printf

我显然不是在这里指责printf,我可能搞砸了我的mem分配和访问权限,但是我不明白我在哪里做错了。程序在main中的第二个printf上崩溃。如果我评论第二个,它也会在第三个崩溃。实际上,每当我在第一个printf之后访问p时,它就会崩溃!

有人可以解释我在做什么吗?

非常感谢。

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

person * new_person(char * firstname, char * lastname, int age)
{
    person p;
    int lf = strlen(firstname);
    int ll = strlen(lastname);
    p.firstname = (char *)malloc(++lf * sizeof(char));
    p.lastname = (char *)malloc(++ll * sizeof(char));
    strcpy(p.firstname, firstname);
    strcpy(p.lastname, lastname);
    p.age = age;

    return &p;
}    

int main()
{
    person * p = new_person("firstname", "last", 28);

    printf("nom : %s ; prenom : %s ; age : %d\n", p->lastname, p->firstname, p->age);
    printf("nom : %s ; prenom : %s ; age : %d\n", p->lastname, p->firstname, p->age);

    printf("nom : %s ; prenom : %s ; age : %d\n", (*p).lastname, (*p).firstname,(*p).age);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Wug*_*Wug 5

您正在返回局部变量的地址。

您可以修改您new_person的参数以使用一个参数(指向人的指针),也可以malloc在函数内部进行操作并进行操作。

函数返回时,您在函数中声明的人员将超出范围。此后发生的所有事情都是不确定的。它可能偶尔会保留其值一段时间,但是您不应该依赖于此。当您调用printf时,堆栈会增加并用新内容覆盖您人员的旧位置。

  • 除非OP理解为什么这是一个主要的禁忌,否则这个答案并不能真正解释为什么这样做是一个坏主意。 (2认同)