结构的指针算法

use*_*891 13 c struct pointers pointer-arithmetic

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

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

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

tan*_*grs 20

struct foobar *p;
p = 0x1000; 
p++;
Run Code Online (Sandbox Code Playgroud)

是相同的

struct foobar *p;
p = 0x1000 + sizeof(struct foobar);
Run Code Online (Sandbox Code Playgroud)


Cha*_*tin 5

答案是至少是

sizeof(double) + (3*sizeof(int))
Run Code Online (Sandbox Code Playgroud)

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

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

| double     | int | int | int | 16 bits padding |
Run Code Online (Sandbox Code Playgroud)

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

更新

请注意,这在 32 位计算机上也可能成立:那么您可能需要填充以将其放入三个单词中。我不知道有哪台现代机器不能寻址到字节,所以现在可能很难找到一个例子,但许多旧的体系结构可能需要这个。


nos*_*nos 5

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

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