【问题标题】:pointer to struct member without initialization [duplicate]指向没有初始化的结构成员的指针[重复]
【发布时间】:2020-03-17 13:05:48
【问题描述】:

好吧,我认为这可能是一个愚蠢的问题,但我想知道这段代码是如何工作的。

这是一个示例代码。

typedef struct {
    int first;
    int second;
    int third;
}mypointer;

int main()
{
    mypointer *mp = 0;
    printf("this is third member : %p\n", &mp->third);

    return 0;
}

我猜它应该返回分段错误,因为指针 mp 指向零地址并指向无效的内存地址。然而,实际结果却不同。

this is third member : 00000008

我知道,这很糟糕,但它有效。

所以,我想当我指向结构成员时,无论结构是否分配,我都能获得结构成员的地址。

这是正确的吗?

【问题讨论】:

  • 为什么要在没有正常初始化的情况下获取指向零地址的结构成员的地址?
  • @JimmyHu 看看offsetof() 的一些实现。 为什么这实际上是一个非常有趣的问题。
  • sizeof(int) = 4。它确实如此:mov QWORD PTR [rbp-8], 0,所以你可以看到它将指针初始化为 0。然后它执行 mov rax, QWORD PTR [rbp-8].. 它将指针存储在 rax 中。现在它确实是add rax, 8(两个整数)......所以从技术上讲,它实际上从未取消引用指针。
  • 指针无效,但它永远不会被取消引用。拥有无效指针(NULL 是其中之一)是完全合法的,只要您不取消引用它们并且您的代码没有。
  • @JimmyHu 见过类似offsetof()的代码,但不知道代码到底是什么意思。 @AndrewHenle 谢谢,offsetof() 很好地解释了我的示例代码。

标签: c pointers struct


【解决方案1】:

你初始化了mypointer *mp = 0

当您将pointer 的负责人指向zero address 时:

mp->first 的地址在您初始化时是 &mp->first=00000000。然后对于 mp->second(指针算术的工作方式),它将指向 address of mp->first + sizeof(int) 然后对于
mp->third 地址将是 @987654329 @。

假设 int 在您的系统中是 4 字节,所以 &mp->third=00000000+4+4

等于00000008

但是由于头指向NULL,您无法访问内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多