gpt4 book ai didi

c - 如何通过指针运算访问内存块的头?

转载 作者:行者123 更新时间:2023-11-30 16:20:13 25 4
gpt4 key购买 nike

我正在解决一个家庭作业问题,其中包括制作一个用户可以用来管理内存的 C 程序。本质上,我们试图以我们自己的方式模仿 malloc() 和 free() 的功能。我当前正在开发的函数是一个 initmemory(int size) 函数,它分配用户将使用的整个 block ,并且当程序调用 myalloc() 函数时,将从该 block 开始分配较小的 block (基本上是我们版本的 malloc ())。我的问题是,我试图访问整个 block 的 header 部分,以保存 block 的大小和分配状态,但是当我尝试执行指针算术时,我最终只移动了一位。如何访问 header ,以便使用指针变量 startOfMemory 保存 block 的大小和分配状态

void initmemory(int size){
printf("this is the initial size: %d\n", size);
//realSize = size + initial padding + anchorHeader + sentinelBlock
int realSize = size + 12;
printf("I am the new realSize: %d\n", realSize);
//checks how many remainders are left
int check = realSize % 8;
printf("this is the value of check: %d\n", check);
//will only change realSize if check is not zero
if(check != 0){
//adds enough bytes to satisfy 8-byte alignment
realSize = realSize + (8 - check);
/*
* this is only to make sure realSize is 8-byte aligned, it should not run
* unless the above code for some reason does not run
*/

check = realSize % 8;
while(check != 0){
realSize = realSize + (8-check);
check = realSize % 8;
printf("I'm in the while check loop");
}
}
// initializes the memory to be allocated.
void *startOfMemory = malloc(realSize);
void *placeOfHeader = startOfMemory - 1;

printf("my memory location is at: %p\n", startOfMemory);
printf("my realSize is: %d\n", realSize);
printf("memory location of placeOfHeader: %p\n", placeOfHeader);
free(startOfMemory);

}
int main(){
initmemory(5);
return 0;
}

调用 malloc() 函数的 startOfMemory 的内存位置位于 0x87a3008(由于 8 字节对齐,这是有意义的)

当我进行指针运算时,如header的变量位置,placeOfHeader的内存位置是0x87a3007。

最佳答案

placeOfHeader 不在分配区域中的某个位置。您可能想写这样的东西。

//alloc(realSize)
void *placeOfHeader = malloc(realSize);
*((size_t*)placeOfHeader) = realSize;
void* startOfMemory = (size_t*)placeOfHeader + 1;
return startOfMemory;

//free(startOfMemory)
void* placeOfHeader = (size_t*)startOfMemory - 1;
size_t realSize = *((size_t*)placeOfHeader);
free(placeOfHeader)

关于c - 如何通过指针运算访问内存块的头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55387834/

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