这个结构体的大小是什么情况?

13 浏览
0 Comments

这个结构体的大小是什么情况?

我在研究C语言中的结构体时,注意到了这个奇怪的现象。编译这个程序后,应该输出vulnStruct及其元素的大小。手动计算结构体的大小应该是38个字节,然而当运行这个程序时,它显示结构体的大小实际上是40个字节。起初,我以为这只是结构体的填充,就像在这里解答的一样(Size of a structure in C),然而,当我在结构体的末尾添加一个2字节的字段(uint16_t)试图填充填充空间时,它只会增加结构体2个字节。这是因为编译器将controlledPointer填充到10个字节,并且不允许其他字段使用该空间,还是因为末尾有类似canary的东西占用了空间?如果只是填充,有没有办法安排元素,以便填充空间可以被另一个字段使用?

编辑:

如果我提供程序的输出结果可能会有所帮助:

Sizeof vulnStruct: 40
Sizeof start: 20
Sizeof overflow: 10
Sizeof controlledPointer: 8

提前感谢!

0
0 Comments

出现问题的原因是在结构体中存在对齐填充。在这个例子中,编译器通过给"controlledPointer"字段填充2个字节来对齐该字段,从而导致结构体的大小增加。

要解决这个问题,可以采取以下措施之一:

1. 调整结构体的字段顺序,使得需要对齐的字段尽可能靠近结构体的开头,从而减少填充的字节数。

2. 使用编译器提供的对齐指令,例如在C语言中可以使用#pragma pack指令来指定结构体的对齐方式。

3. 如果对齐填充并不重要,可以通过编译选项来禁用对齐警告。

需要注意的是,不同的目标平台和编译器可能会产生不同的结果,因此在编写代码时应该注意对齐填充可能导致的问题,并根据具体情况进行调整。

0
0 Comments

这个问题的原因是结构体的字段之间存在字节对齐。字节对齐是一种优化技术,它将字段按照特定的字节边界对齐,以提高内存访问的效率。通常情况下,2个字节的内存开销要比非对齐内存访问的时间开销要小。

然而,在某些情况下,字节对齐可能会导致问题。一种情况是当你需要与其他结构体匹配时,另一种情况是当你有大量的元素时。在这些情况下,你需要相应地声明结构体以满足对齐要求。

根据问题描述,这个结构体的字段大小可能是8个字节的指针。如果是8字节对齐,那么在start[20]和overflow[10]之间应该会有填充字节。因此,这里使用的是4字节对齐。

通常情况下,char数组没有对齐要求。如果将字段改为start[19]和overflow[11],你应该不会看到大小的差异。

解决这个问题的方法是根据实际需求调整结构体的声明,以满足对齐要求。具体的C语言声明方式需要参考相关文档或者查阅C语言的相关知识。

0
0 Comments

这里讨论的问题是关于结构体的大小问题。结构体存在“填充”现象,这意味着如果在结构体中只有一个字符,那么这个结构体的大小很可能是4字节/8字节,这取决于处理器的数据总线。这是因为为了优化访问速度,在编译时结构体会用0xff字节进行填充。

虽然有一些编译指令可以避免填充,但这并不推荐,除非你正在编写实际设备的程序。在gcc(默认的Unix编译器)中可以使用以下指令,但具体取决于每个编译器:

#pragma (push,pack 1)
// 定义结构体...
#pragma (pop)

在这种情况下,编译器会为指令创建一个自己的堆栈。如果想更清楚地了解填充和`#pragma`指令,请参考[这篇帖子](https://stackoverflow.com/questions/3318410)。

0