[英]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.