指向一个空结构

Pointing to an empty struct

我很好奇为什么会出现以下段错误:

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 is located at 0x55a3629e0340.
Segmentation fault (core dumped)

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

hammy 声明为 Book * 类型,指向 Book 的指针,只是一个整数。但那一刻是uninitialized. It will contain whatever garbage was on the 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 类型的实例。