簡體   English   中英

C : mmap 在 0xffffffff 處初始化

[英]C : mmap initialize at 0xffffffff

我目前正在為一個 C 項目做內存分配器,但我正面臨一些我不明白的事情

我正在調用 mmap 為我的程序保留堆,我將在其中放置一些標題。

我有

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 時,它會返回無效參數錯誤。

為什么當我使用 Mem_Init 方法調用它時 mmap 返回一個有效地址,為什么當我在 Mem_Alloc 方法中調用 Mem_Init 時它返回我 invalidArgument ?

提前致謝

通過一些小的更改,您的代碼似乎可以正常工作:

#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));
    }

感謝你們的支持

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM