15、数据类型与数据结构深入解析

数据类型与数据结构深入解析

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值