指向一个空结构

问题描述

我很好奇为什么发生以下段错误

typedef struct Book {
    char* title;
    unsigned int year;
} Book;
int main(int argc,char * argv[]) 
{
    Book *hammy;
    printf("Hammy is located at %p.",hammy);
    printf("Hammy has the title: %s.",hammy->title);
}

Hammy位于0x55a3629e0340。
分段错误(核心已转储)

例如,为什么hammy->title不打印空字符串或\0或出现一些乱码或其他内容?创建指向(未定义的)Book的指针时,它指向什么开始?

解决方法

hammy被声明为类型Book *,它是Book的指针,只是一个整数。但这是uninitialized。它将包含当时stack上的所有垃圾。就我而言,它是0。

您可以打印hammy,因为它只是一个整数。当您尝试使用hammy->title取消引用指针时,操作系统将不允许您使用该指针。它指向的内存不属于该进程,或者为空。您得到segmentation fault

您需要使用一些东西对其进行初始化。

Book *hammy = &(Book){
    .title="Nothing in This Book Is True,but It's Exactly How Things Are",.year=1994
};
,

首先,

预定* hammy;

这意味着您正在声明指针变量。由于未使用book变量的任何地址进行初始化,因此它将包含随机地址。这就是细分错误的原因。

第二,

未声明书的变量,因此我们如何获取书的内容,声明指针并不意味着我们在声明书的实例。我们只是告诉指针,存储在 hammy 中的地址将指向Book类型的实例。