数据类型与数据结构深入解析
1. 数组与堆数组
当变量作为数组的索引时,数组是最容易识别的。数组访问操作需要将索引乘以数组元素的大小,然后将结果偏移量加到数组的基地址上,这在反汇编列表中很突出。
以堆数组函数为例,与栈分配的数组函数不同,反编译器列表显示了常量索引数组赋值,尽管通常会排除它们,因为数组未在其他操作中使用或从函数返回。这是因为赋值操作不仅仅是操作栈变量,栈变量实际上是一个指向 malloc 从堆中请求的内存的指针。通过该变量写入不会写入本地栈变量,而是使用栈变量来定位分配的内存。函数退出时,程序可能会丢失指针(堆数组的起始地址),但值会保留在内存中,这其实是内存泄漏的一个示例。
2. 结构体成员访问
C 风格的结构体将(通常是异构的)数据项集合组合成复合数据类型。在源代码中,结构体中的数据字段通过名称而不是索引访问。但编译器会将这些有意义的字段名称转换为数字偏移量,所以在查看反汇编时,结构体字段访问看起来与使用常量索引访问数组元素非常相似。
以下是一个包含五个异构字段的结构体定义:
struct ch8_struct { //Size Minimum offset Default offset
int field1; // 4 0 0
short field2; // 2 4 4
char field3; // 1 6 6
int
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



