给定一个包含一个double和3个int变量的结构定义(总共4个变量),如果p是指向此结构的指针,值为0x1000,那么p ++有什么值?
这不是作业问题,所以不要担心。我只是想为测试做准备,我无法弄清楚这个练习题。感谢
这是在C中。是的,我希望p增加后的值。这是一台32位机器
答案 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(数据类型)