C 解引用指针

标签 c pointers memory

我开始学习 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 的指针,请在使用前创建一些内存:

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;
}

或者,您可以简单地将 address of 传递给 person 的非指针实例(使用 &)以获得相同的结果:

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 字节的连续 block 的第一个字节重合的内存位置,这些字节被预留并专用于,在这种情况下,我的人。以这种方式分配的内存称为堆内存,必须通过调用 free() 显式释放。 不再需要时。通常,只有在编译时不知道特定变量的内存要求时才推荐使用此方法

但是语句:

person myPerson;

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

Stack and heap memory explained.

Discussion on automatic, static and dynamic memory allocation

关于C 解引用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53852762/

相关文章:

我不能无限期地使用 fscanf() 吗?

c++ - 如何在固定宽度类型上强制执行无符号算术?

指向 QGraphicsItem 的指针的 c++ 列表

c++ - 1 [main] 972 exception::handle: Exception: STATUS_ACCESS_VIOLATION 说明及修复方法

c# - 用指针改变内存内容?

关于 C 中 "while(*s1++ = *s2++);"的困惑

c - 如何预处理 ld 链接描述文件?

c++ - 指针转换错误c++

memory - __attribute__((packed,aligned(n))) 和 __attribute__((aligned(n))) 有什么区别?

java - 使用方法的返回值和保留它们有什么区别?