【问题标题】:Why self-referential struct in C output is nill为什么 C 输出中的自引用结构为空
【发布时间】:2021-02-27 01:44:03
【问题描述】:

我想在 C 中创建一个结构,并且我希望它只有一个组件作为它的地址。

换句话说,我只是创建了一个单组件自引用结构:

#include <stdio.h>
#include <string.h>
 
struct Books {
   struct Books *ptr; //* the only one component of this structure*//
};

int main( ) {
    struct Books book1;
    printf("%p\n", book1.ptr);
    
    return 0;
}

这个脚本的输出是 - nil。

我的问题是 - 为什么?该脚本在计算机内存中创建了一个物理条目,其中记录了一个组件 structbook1。

现在我想查看这个结构的地址(或者换句话说,我想查看这个单组件结构的内容)。

一旦它物理存在,为什么它给我的输出为零?

【问题讨论】:

  • nil 是未定义的行为,恰好 book1 的内存为 nil。要获得您期望的行为,您必须这样做book1.ptr=&amp;book1
  • 你从未初始化过book1.ptr,因此它的内容是不确定的。
  • struct Books book1; book1.ptr = &amp;book1;

标签: c pointers self-reference construct


【解决方案1】:

试试这个:printf("%p\n", &amp;book1); 打印结构的地址。 您正试图打印出一个未初始化的值并且程序具有未定义的行为。 使用 & 打印地址

【讨论】:

  • 不管ptr初始化为book1的地址和book1.ptr的地址是否相同,其实你可以灵活一点,使用&amp;book1.ptr
【解决方案2】:

如果您希望结构成员(或任何对象)具有特定值,则必须对其进行初始化或分配以具有该值。仅仅因为成员的类型是“指向struct Books 的指针”并不意味着它指向它所在的struct Books 或者它具有任何其他特定值。

使用struct Books book1 = { &amp;book1 };

此外,printf%p 转换应提供 void * 参数,因此请转换您传递的地址:printf("%p\n", (void *) book1.ptr);

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多