C解除引用指针

Hor*_*rst 2 c memory pointers

我开始学习C,我不知道为什么应用程序不断崩溃.

#include <stdio.h>
#include <string.h>

typedef struct
{
    char name[50];
    int age;
}person;

void initPerson(person *aPerson, char name[50], int age)
{
    strcpy(aPerson->name, name); // <- causes a crash
    aPerson->age = age; // <- causes a crash
    printf("%s", aPerson->name);
}

int main()
{
    person *myPerson;
    initPerson(myPerson, "Oscar", 45);

    printf("%s, %i", myPerson->name, myPerson->age);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经标记了导致崩溃的线条.谁能告诉我这是什么问题?

ryy*_*ker 8

"......应用程序一直在崩溃......,有人能告诉我这个问题是什么吗?"
是的,您的程序正在尝试写入它不拥有的内存位置.

如果必须使用指针person,请在使用之前创建一些内存:

int main()
{
    person *myPerson = calloc(1, sizeof(*myPerson));
    if(!myPerson) return 0; //test if failed

    initPerson(myPerson, "Oscar", 45);

    printf("%s, %i", myPerson->name, myPerson->age);
    free(myPerson);//free memory
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以简单地传递(using )非指针实例的地址以获得相同的结果:person&

int main()
{
    person myPerson = {0};

    initPerson(&myPerson, "Oscar", 45);
    printf("%s, %i", myPerson.name, myPerson.age);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该声明:

person *myPerson;
Run Code Online (Sandbox Code Playgroud)

仅创建未初始化的指针,而不是在创建时指向内存中的任何特定位置.此时使用的唯一空间是指针本身sizeof(person *).(对于32位或64位目标,分别为4或8个字节.)在以这种方式使用指针变量之前,必须通过调用_ void*calloc(size_t nitems,size_t size) _或family 来动态分配空间.以这种方式创建的存储器将指针的地址设置为与预留的并且专用于在这种情况下使用的连续字节块的第一个字节一致的存储器位置.以这种方式分配的内存称为堆内存,必须在不再需要时调用free()显式释放.通常,仅当在编译时不知道特定变量的内存要求时,才建议使用此方法 nitems*sizemyPerson

但声明:

person myPerson;
Run Code Online (Sandbox Code Playgroud)

静态地(或者自动地,取决于它创建的时间/地点.)sizeof(person)为一个可立即使用的实例分配内存,该实例myPerson位于地址的内存中:&myPerson.以这种方式创建的内存称为堆栈内存.因为传递myPerson(&myPerson)的地址作为参数initPerson(),并完成与动态分配的内存(如上所述)完成相同的事情,这是一个更简单的选项,因为它不需要任何内存创建或释放.

堆栈和堆内存解释.

关于自动,静态和动态内存分配的讨论