【发布时间】: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()很好地解释了我的示例代码。