You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:43:28