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

C语言内存转储程序:特定地址的最佳数据类型及代码优化问询

关于C语言内存转储程序的地址类型与代码修改方案

嘿,我来帮你搞定这个memdump程序的问题!针对你的两个疑问,我整理了实用的解决方案:

一、存储目标地址的最佳数据类型

毫无疑问,uintptr_t 是存储内存地址的最优选择,它定义在<stdint.h>头文件中:

  • 这是C标准专门为存储指针的整数表示设计的类型,能保证在任何平台(32位/64位)下都能完整容纳一个指针的数值,避免因平台位数差异导致的地址截断问题。
  • 别用int、long这类普通整数类型,它们的宽度在不同系统上不一致(比如32位系统long是4字节,64位是8字节),无法可靠适配所有环境。

二、修改代码支持指定地址的内存转储

你可以通过命令行参数传入目标地址,然后完成地址转换与内存读取,具体步骤和示例代码如下:

核心步骤

  1. 解析命令行参数:获取用户传入的十六进制地址字符串。
  2. 字符串转地址:用strtoull(支持64位)将十六进制字符串转换成uintptr_t类型。
  3. 转换为指针:把uintptr_t强转为void*,用来指向目标内存区域。
  4. 内存转储打印:通过指针逐字节读取并格式化输出内存内容。

修改后的示例代码

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#define DUMP_BYTES 32  // 可自定义每次转储的字节数

// 格式化打印内存内容的函数
void print_memory_dump(void* start_addr, size_t byte_count) {
    uint8_t* mem_ptr = (uint8_t*)start_addr;
    
    for (size_t i = 0; i < byte_count; i++) {
        // 每8字节换行并打印当前地址
        if (i % 8 == 0) {
            printf("\n%p: ", mem_ptr + i);
        }
        // 按十六进制打印单个字节
        printf("%02x ", mem_ptr[i]);
    }
    printf("\n");
}

int main(int argc, char* argv[]) {
    // 检查命令行参数是否正确
    if (argc != 2) {
        fprintf(stderr, "使用方式: %s <目标地址(十六进制,如0x7ffeefbff5c0)>\n", argv[0]);
        return EXIT_FAILURE;
    }

    char* parse_end;
    // 将十六进制字符串转换为uintptr_t类型的地址值
    uintptr_t target_address = strtoull(argv[1], &parse_end, 16);
    
    // 检查地址字符串是否有效
    if (*parse_end != '\0') {
        fprintf(stderr, "错误: 输入的地址格式无效,请输入十六进制值(可带0x前缀)\n");
        return EXIT_FAILURE;
    }

    // 转换为void*指针,指向目标内存
    void* dump_addr = (void*)target_address;

    // 执行内存转储
    printf("正在转储地址 %p 的内存:\n", dump_addr);
    print_memory_dump(dump_addr, DUMP_BYTES);

    return EXIT_SUCCESS;
}

注意事项

  • 编译时记得包含<stdint.h>头文件,确保uintptr_t能被识别。
  • 如果要转储其他进程的内存,你需要使用系统级API(比如Linux的ptrace、Windows的ReadProcessMemory),当前代码仅适用于读取自身进程的内存。
  • 运行时如果出现段错误,大概率是因为你访问了不属于当前进程的内存区域,这是操作系统的保护机制,属于正常现象。

内容的提问来源于stack exchange,提问作者Dries Jans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:14:42