结构的指针算法

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

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

这是在C.是的,我希望p增加后的值。 这是一台32位机器

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

是相同的

 struct foobar *p; p = 0x1000 + sizeof(struct foobar); 

答案是它至少是

 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位机器上观察到这一点也是如此:那么你可能需要填充以使其适合三个单词。 我不知道现代机器没有解决这个字节,所以现在可能很难找到一个例子,但是一堆旧架构应该需要这个。

 p = p + sizeof(YourStruct) 

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

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

因此,如果在指向结构的指针上执行p++ ,p将按sizeof *p字节前进。 即问问你的编译器你的struct与sizeof运算符有多大。