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

如何通过二级指针访问指向指针数组的输入内存块并获取所有存储值

enter image description here

我需要实现对指向指针数组的指针的访问操作,目前已成功完成上层内存块与底层内存块的映射工作。

unsigned int *outputAddress =  NULL;
unsigned int *outputOffsetAddress = NULL;
unsigned int *OutputptrptrAddr = NULL;
unsigned int *PtrArr[250];
unsigned int **val = PtrArr;

void MemoryMapping(unsigned int outputOffsetRTI)
{
    unsigned int *memBase;
    memBase = (unsigned int *)malloc(2000);

    outputAddress = (unsigned int *)(memBase + outputOffsetRTI);
    for (int x = 0; x < 5; x++)
    {
        *outputAddress = 123;
        *outputAddress++;
    }
    outputAddress = outputAddress - 5;
    
    for (int x = 0; x < 5; x++)
    {
        PtrArr[x] = (unsigned int *)outputAddress;
        outputAddress += 1;
    }
    
    outputOffsetAddress = outputAddress + 250;

    for (int x = 0; x < 5; x++)
        outputOffsetAddress[x] = (unsigned int)PtrArr[x];
}

问题

请问该如何遍历输入指针块,从中获取输入块内存储的全部值?


具体实现方式

你当前搭建的内存逻辑是两层独立的指针访问链路:

  • 第一层:PtrArr 是容量250的指针数组,前5个元素分别指向连续内存块中存储的有效数值
  • 第二层:outputOffsetAddress 指向的内存块,把第一层指针数组里存的5个指针值,以整数形式做了一份冗余备份

对应两个不同的访问入口,遍历方式也有区别:

  • 直接访问原始指针数组
    这是最直接的路径,不需要依赖冗余存储的内容,直接遍历指针数组、解引用每个元素指向的地址即可:
    for (int i = 0; i < 5; i++) {
        // PtrArr[i] 本身就是指向存储值的指针,直接解引用即可拿到数值
        unsigned int val = *PtrArr[i];
    }
    
  • 从冗余备份的内存块访问
    如果你需要从outputOffsetAddress指向的块做遍历,需要先把块里存储的整数形式的地址,转回指针类型再做解引用:
    for (int i = 0; i < 5; i++) {
        // 把整数形式的地址转回对应类型的指针
        unsigned int *targetPtr = (unsigned int *)outputOffsetAddress[i];
        unsigned int val = *targetPtr;
    }
    

代码需要修正的隐患

如果直接按现有逻辑运行,遍历过程很容易出现地址异常,需要提前修正几个问题:

  1. 指针步长导致的地址计算错误:memBase是unsigned int*类型,指针加法运算时会自动按unsigned int的长度(4字节)计算步长。如果outputOffsetRTI是字节维度的偏移量,最终计算出的地址就会偏差。需要先把基地址转成char*类型再做偏移计算,避免步长干扰:
    // 修正前:按4字节步长计算偏移
    outputAddress = (unsigned int *)(memBase + outputOffsetRTI);
    // 修正后:按1字节步长计算字节偏移
    outputAddress = (unsigned int *)((char*)memBase + outputOffsetRTI);
    
  2. 指针截断问题:unsigned int通常是4字节长度,但64位系统下指针是8字节长度,把指针强转成unsigned int存储会截断高32位地址,后续解引用时直接变成野指针。存储指针地址时请使用<stdint.h>头文件定义的uintptr_t类型,这个类型的长度和当前系统的指针长度完全匹配,不会出现截断问题。
  3. 内存越界风险:当前申请的堆内存只有2000字节,需要手动核算所有写入操作的总长度,确保不会越界访问申请范围外的地址。

内容的提问来源于stack exchange,提问作者siddharth taunk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 08:27:05