【问题标题】:C Dereferencing pointerC 取消引用指针
【发布时间】:2019-05-20 00:51:34
【问题描述】:

我开始学习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;
}

我已经标记了导致崩溃的行。谁能告诉我是什么问题?

【问题讨论】:

  • person *myPerson; 需要给myPerson分配内存。
  • 你可以用person *myPerson = malloc(sizeof(person));来做。
  • 请记住,在 C 中,您可以动态分配,但您没有义务person myPerson; initPerson(&amp;myPerson, "Oscar", 45); 可以工作并避免与动态内存管理。谷歌memory leaks :)
  • 啊,所以 person myPerson 会自动分配内存,但 person *myPerson 不会,因此必须手动分配: person *myPerson = malloc(sizeof(person));
  • 确实是这个意思。

标签: c pointers memory


【解决方案1】:

“...应用程序不断崩溃。,...谁能告诉我问题出在哪里?”
是的,您的程序正在尝试写入它不拥有的内存位置。

如果必须使用指向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;
}

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

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

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

声明:

person *myPerson;

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

但是声明:

person myPerson;

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

Stack and heap memory explained.

Discussion on automatic, static and dynamic memory allocation

【讨论】: