如何在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
相关产品推荐
相关产品推荐

