指针运算的结构

问题描述 投票:13回答:5

由于包含一张双人床和3个int变量(4个变量在所有),如果p是一个指针,这个结构与值0x1000的一个结构的定义,并p ++有什么价值?

这不是一个家庭作业的问题,所以不用担心。我只是想为测试做准备,我无法弄清楚这种做法的问题。谢谢

这是C.是的,我想p的值就递增后。这是一个32位的机

c pointers struct pointer-arithmetic
5个回答
20
投票
struct foobar *p;
p = 0x1000; 
p++;

是相同的

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

3
投票

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

所以,如果你做p++上的指针,你的结构,对将sizeof *p字节前进。即只问你的编译器为你的结构有多大用sizeof运营商。


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
投票
p = p + sizeof(YourStruct)

编译器可以自由地决定什么,如果你不把填充过的sizeof将返回。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.