gpt4 book ai didi

c - sbrk(0) 和 sbrk(size) 都返回相同的地址

转载 作者:行者123 更新时间:2023-12-02 06:37:08 25 4
gpt4 key购买 nike

#include<unistd.h>
#include<stdio.h>

void *my_malloc(size_t size){
void *p;
void *q;
p = sbrk(0);
/* If sbrk fails, we return NULL */
q = sbrk(size);
if(q == (void *)-1){
return NULL;
}
printf("\n size : %d p : 0x%x q : 0x%x \n",size,p,q);
return p;
}
int main(){
int *p;
p = my_malloc(5);
printf("\n p : 0x%x \n",p);
}

brk(2) 将中断放置在给定的地址 addr 处,如果成功则返回 0,否则返回 -1。全局 errno 符号指示错误的性质。
sbrk(2) 按给定的增量(以字节为单位)移动中断。根据系统实现,它返回前一个或新的中断地址。失败时,它返回 (void *)-1 并设置 errno。在某些系统上 sbrk 接受负值(为了释放一些映射内存。)
由于 sbrk 的规范并没有固定其结果的含义,因此我们在移动中断时不会使用返回值。但是,我们可以使用 sbrk 的一个特例:当 increment 为 nul(即 sbrk(0))时,返回值是实际的中断地址(前一个和新的中断地址相同。)因此使用 sbrk 来检索堆的开始,这是中断的初始位置。
所以使用sbrk作为主要工具来实现malloc。

sbrk(0) 和 sbrk(size) 都返回相同的地址,我期望的是 sbrk(size) 应该返回 sbrk(0) 前面 5 个字节的地址。

最佳答案

当您使用 sbrk(0) 时,您将获得当前的“中断”地址。

当您使用 sbrk(size) 时,您将获得先前的“中断”地址,即更改之前的地址。

因此,如果您以零大小调用它一次,然后以正大小调用它,则两者都将返回相同的值。如果在以正大小调用之后再次以零大小调用它,它将返回新地址。

关于c - sbrk(0) 和 sbrk(size) 都返回相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16036595/

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