C : mmap 在 0xffffffff 处初始化

C : mmap initialize at 0xffffffff

我目前正在为一个 C 项目做一个内存分配器,我遇到了一些我不明白的事情

我正在调用 mmap 为我的程序保留堆,我将在其中放置一些 headers。

我有

void * START_ADDRESS;
int MEMORY_INITIALIZED;

void* Mem_Init(int sizeOfRegion){
    START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);

    header_t* startingHeader = START_ADDRESS;

    //rest of the fontion
}

void* Mem_Alloc(int size){
    if(MEMORY_INITIALIZED==0){
    START_ADDRESS= Mem_Init(size); 

    //rest of the funtion
}

当我在此代码上使用 errno 时,它 returns 我遇到了无效参数错误。

当我使用 Mem_Init 方法调用它时,为什么 mmap returns 是一个有效地址,为什么当我在 Mem_Init 中调用 Mem_Init 时,为什么它 returns 我无效=25=] 方法 ?

提前致谢

经过一些小改动,您的代码似乎可以正常工作:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/mman.h>

void * START_ADDRESS;
int MEMORY_INITIALIZED = 0;

void* Mem_Init(int sizeOfRegion){
    START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);

    if ((void *) -1 == START_ADDRESS) {
        printf("Could not map memory: %s\n", strerror(errno));
    }

    printf("%p\n", START_ADDRESS);

    void* startingHeader = START_ADDRESS;

    //rest of the fontion
    return startingHeader;
}

void* Mem_Alloc(int size){
    if(MEMORY_INITIALIZED==0){
    START_ADDRESS= Mem_Init(size); 
    }

    //rest of the funtion
    return START_ADDRESS;
}

int main(void) {
    Mem_Alloc(1024);
    return 0;
}

编译使用

gcc -Wall -Werror -o code code.c

我认为最重要的变化是 MEMORY_INITIALIZED 设置为 0,但语言律师向我保证,遵循 C89 标准的编译器已经这样做了。

终于找到错误了

在老师给我们的测试程序中,他试图分配一个0大小的头,而当你试图分配一个空指针时mmap失败。

一个简单的更正是

void* Mem_Init(int sizeOfRegion){
    if(sizeOfRegion==0) sizeOfRegion = 1024; //1024 is an exemple
    START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);

    if ((void *) -1 == START_ADDRESS) {
        printf("Could not map memory: %s\n", strerror(errno));
    }

感谢大家的支持