结构的指针算法

时间:2011-10-01 23:50:32

标签: c pointers struct pointer-arithmetic

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

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

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

5 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:3)

答案是至少

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

答案 2 :(得分:2)

p = p + sizeof(YourStruct)

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

答案 3 :(得分:2)

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

因此,如果对指向结构的指针执行p++,则p将前进sizeof *p个字节。也就是问问你的编译器你的结构与sizeof运算符有多大。

答案 4 :(得分:0)

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