gpt4 book ai didi

C : mmap initialize at 0xffffffff

转载 作者:行者123 更新时间:2023-11-30 19:14:37 24 4
gpt4 key购买 nike

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

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

我有

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 标准的编译器已经完成了这一点。

关于C : mmap initialize at 0xffffffff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33791310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com