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

如何在C语言中对全局变量做类型转换以存储内存地址?

解决用int类型全局变量存储指针地址的问题

这问题挺有意思的——要把mmap返回的指针塞进一个int类型的全局变量里,还得能完整取出来打印,对吧?咱们一步步来实现:

1. 把指针存储到m_error里

在init_mem函数中,直接通过强制类型转换把void*类型的指针转换成int,赋值给m_error就行。代码修改如下:

#include "mem.h"
#include <sys/mman.h> // 别忘了包含mmap依赖的头文件

int m_error;
void *init_mem(int size){
    void *ptr = mmap(/*填入你的参数,比如NULL, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0*/); 
    // 将指针强制转换为int类型,存入m_error
    m_error = (int)ptr;
    return ptr;
}

2. 从m_error恢复指针并打印

在free_mem函数中,需要把int类型的m_error再转换回void*,然后用printf的%p格式符打印地址(%p要求参数必须是void*类型):

#include <stdio.h> // 包含printf依赖的头文件

void free_mem(){
    printf("free memory: %p\n", (void*)m_error);
    // 如果需要释放内存,也可以用转换后的指针调用munmap
    // munmap((void*)m_error, size); 这里的size需要你自行保存,或者如果是固定值可直接填写
}

重要注意事项

得提个关键的坑:如果你的程序运行在64位系统上,int通常是4字节,而指针是8字节。这种情况下把指针转成int会丢失高位地址信息,之后再转回来就不是原来的地址了,会导致munmap失败或者其他错误。

如果可以修改m_error的类型,更推荐把它改成intptr_t(需要包含<stdint.h>头文件)——这是C标准库提供的专门用来存储指针的整数类型,能保证和当前平台的指针宽度一致,完全避免截断问题。但如果必须用int,那只能接受这个平台兼容性的限制,仅在32位系统或者指针地址高位为0的场景下正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:25:42