0

以下代码:

#include <stdio.h>
#include <stdlib.h>


typedef struct mytype {
  int x; int y; int z;
} mytype;
int main ()
{
  mytype* p = (mytype*)4;
  void* pp = &(p->x);
  printf("%d\n",(int)pp);

}

按预期打印“4”。

但是如果我换行:

void* pp = &(p->x);

到:

void* pp = &(p->y);

它打印“8”。此外,如果我将其更改为 p->z,它会打印“12”。

这是为什么?

4

2 回答 2

3
mytype* p = (mytype*)4;

声明一个指向mytype地址类型的指针0x04

void* pp = &(p->x);
printf("%d\n",(int)pp);

表明 的地址与mytype->x的地址相同mytype

重复p->yp->z显示sizeof(int)==4在您的平台和编译器的成员之间没有插入任何填充mytype

如果您在不同平台上运行代码xy和之间的偏移量可能会发生变化。z

另请注意,我认为

printf("%d\n",(int)pp);

依赖于未定义的行为,因为不能保证sizeof(void*) == sizeof(int)

printf("%p\n",pp);

应该更安全。

于 2013-07-01T15:15:26.800 回答
1

您将指针指向 4 的地址。您的结构 (x) 的第一个成员将驻留在此处,因此如果您打印 x 的内存地址,您将得到您的初始起始位置 ( 4)。当您尝试打印 y 时,它从 8 开始,因为它是一个 int(x 开始和 4 到 8。)与 z 相同(从 12 开始,在 16 结束,y 从 8 开始,在 12 结束) .

虽然那里没有结构,但您将那里的内存转换为您的结构,因此您的指针算术将遵循您的结构的内存布局。

于 2013-07-01T15:15:05.860 回答