Memory management mmap和MAP_错误已修复,用于分配自定义内存地址

Memory management mmap和MAP_错误已修复,用于分配自定义内存地址,memory-management,segmentation-fault,mmap,Memory Management,Segmentation Fault,Mmap,这个软件 #include <sys/mman.h> #include<iostream> main(){ int* p; //int* p = 0x9; std::cout << p << std::endl; int* memptr = mmap((void*) p, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);

这个软件

#include <sys/mman.h>
#include<iostream>

main(){
    int* p;
    //int* p = 0x9;
    std::cout << p << std::endl;
    int* memptr = mmap((void*) p, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
    std::cout << memptr << std::endl;
    std::cout << "-------------------------\n";
    std::cout << *memptr << std::endl;
    std::cout << memptr << std::endl;
    *memptr = 345;
    std::cout << *memptr << std::endl;
    std::cout << memptr << std::endl;   
}
相反,如果没有固定的映射,我会得到

0x7fffee5ce2d0
0x7f4f506ab000
-------------------------
0
0x7f4f506ab000
345
0x7f4f506ab000
但是我希望memptr指向一个分配的内存区域,从p指向的位置开始(请参阅mmap调用。出于这个原因,我尝试了MAP_FIXED flag)。 此外,我希望该位置由用户指定为一个数字,就像我取消对指针初始化的注释时发生的那样,获得:

//int* p;
int* p = 0x9;
那我以后就要了

 int* memptr = mmap((void*) p, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);

memptr指向0x9,其中分别分配了4096或sizeof(int)字节,并可通过

*memptr = 345;

如何做到这一点?

0x9不太可能在可写甚至可分配的地址范围内。例如,在Linux中显示了一个进程的地址空间,其中最低的段-文本-从0x08048000开始,下面没有任何内容。更详细地描述可以使用
mmap
访问的地址。另见:

int* memptr = mmap((void*) p, sizeof(int), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
*memptr = 345;