如何为Rust原始指针存储的地址添加偏移量?
正确实现地址加偏移量的方法
首先明确核心需求:要对地址本身添加偏移,而非读取地址指向的值再做运算。你之前的写法要么触发非法内存访问,要么存在语法/逻辑错误,下面分两种常见场景给出正确实现:
场景1:偏移量为字节数
如果0xF8是你要添加的字节偏移,需要先将*mut u32转为*mut u8(u8是单字节类型,指针加法会严格按字节数计算),添加偏移后再转回原类型:
let base_addr = 0x0112A160 as *mut u32; let byte_offset = 0xF8; // 字节数偏移 // 转换为u8指针按字节偏移,再转回u32指针 let new_address = (base_addr as *mut u8).offset(byte_offset as isize) as *mut u32;
Rust要求指针offset方法的参数为isize类型,因此需要做类型转换。
场景2:偏移量为u32元素个数
如果0xF8是你要跳过的u32元素个数(每个u32占4字节,总偏移量为0xF8 * 4字节),可直接对*mut u32指针使用offset方法:
let base_addr = 0x0112A160 as *mut u32; let element_offset = 0xF8; // u32元素的个数 let new_address = base_addr.offset(element_offset as isize); // 也可直接用+运算符(效果与offset一致) // let new_address = base_addr + element_offset as isize;
你之前的错误原因
- 第一种写法
let new_address: u32 = *base_addr + 0xF8;:直接解引用base_addr试图读取内存值,若该地址不在进程权限范围内,就会触发STATUS_ACCESS_VIOLATION(0xc0000005)。你需要的是地址本身的偏移,而非地址指向的值。 - 第二种写法
let new_address = base_addr + 0xF8 as *mut 32;:存在语法错误(*mut 32不是有效类型,应为*mut u32),同时逻辑错误——若0xF8是字节偏移,直接对*mut u32指针做加法会被当成元素个数,导致实际偏移为0xF8 * 4字节,与预期不符。
内容的提问来源于stack exchange,提问作者johnsc
相关产品推荐
相关产品推荐

