18

给定一个包含一个 double 和三个 int 变量(总共 4 个变量)的结构定义,如果 p 是指向该结构的指针,值为 0x1000,那么 p++ 有什么值?

这不是作业问题,所以不用担心。我只是想为考试做准备,我无法弄清楚这个练习问题。谢谢

这是在 C 中。是的,我想要 p 增加后的值。这是一台 32 位机器

4

5 回答 5

27
struct foobar *p;
p = 0x1000; 
p++;

是相同的

struct foobar *p;
p = 0x1000 + sizeof(struct foobar);
于 2011-10-02T00:58:45.550 回答
4

答案是至少是

sizeof(double) + (3*sizeof(int))

它“至少”的原因是编译器或多或少可以根据底层架构的需要自由添加填充以使其适合对齐约束。

例如,假设您有一台具有 64 位字的机器,例如旧的 CDC 机器。(见鬼,其中一些有 60 位的字,所以它会变得更奇怪。)进一步假设在那台机器上,sizeof(double)是 64 位,sizeof(int)而是 16 位。然后编译器可能会将您的结构布置为

| double     | int | int | int | 16 bits padding |

这样整个结构就可以在 2 个内存引用中通过机器,而无需移动或弄乱。在这种情况下,sizeof(yourstruct_s) 将是 16,其中 sizeof(double)+ (3*sizeof(int))只有48 14。

更新

请注意,这在 32 位机器上也可能是正确的:那么您可能需要填充以将其放入三个单词中。我不知道现代机器不能精确到字节,所以现在可能很难找到一个例子,但是一堆旧架构可能需要这个。

于 2011-10-02T00:37:07.247 回答
4

指针运算以指针类型的大小为单位进行。

因此,如果您p++对指向结构的指针执行操作,则 p 将按sizeof *p字节前进。即只需询问您的编译器您的结构与运算符有多大sizeof

于 2011-10-02T00:51:59.850 回答
3
p = p + sizeof(YourStruct)

如果您不关闭填充,编译器可以自由决定 sizeof 将返回什么。

于 2011-10-02T00:40:25.093 回答
0

数据类型的基地址增量等于基地址 + sizeof(数据类型)

于 2019-02-05T03:42:23.700 回答