C语言指针偏移结果不符合预期,求技术原因解析
问题原因与解决方案
你的核心问题是误解了C语言中指针算术的规则,具体分析如下:
1. 变量类型解析
你定义的uint8_t *source[5];是一个指针数组:
- 数组里的每个元素都是
uint8_t*类型(指向uint8_t的指针) - 在64位系统中,每个指针的大小是8字节(32位系统为4字节)
当你直接使用source时,它会自动退化为指向数组第一个元素的指针,类型是uint8_t**(指向指针的指针)。
2. 指针算术的偏移规则
C语言中,指针加整数N时,实际偏移的字节数遵循:
偏移字节数 = N * sizeof(指针指向的类型)
对于source + 2:
- 指针指向的类型是
uint8_t*,64位系统下大小为8字节 - 所以偏移字节数 = 2 * 8 = 16字节
这就是你看到地址从786796896跳到786796912(差值16)的原因。
3. 实现字节级偏移的方法
如果需要按字节数指定偏移(比如配合memcpy使用),需要先将数组指针转换为uint8_t*类型(uint8_t大小为1字节,偏移1个单位即1字节):
#include <stdio.h> #include <stdint.h> int main() { uint8_t *source[5]; // 初始地址 printf("%p\n", (void *)source); // 按字节偏移2个单位 printf("%p\n", (void *)((uint8_t*)source + 2)); // 地址差值为2,符合预期 }
4. 配合memcpy的注意事项
当使用memcpy时,若要从数组的指定字节偏移位置拷贝,必须确保偏移基于字节计算。例如:
// 从source数组的第2字节开始,拷贝10字节到dest memcpy(dest, (uint8_t*)source + 2, 10);
内容的提问来源于stack exchange,提问作者koga73
相关产品推荐
相关产品推荐

