- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当 sbrk() 返回指向堆起始地址的指针时,地址是升序还是降序?例如,如果我有一个从地址 1 到 10 的 10 字节堆,sbrk() 会返回指向地址 10 或 1 的指针吗?
类似地,堆地址往往会“下降”......但是我如何才能确定地址在我的计算机上是增加还是减少?
最佳答案
Mac OS X 的手册页说:
The
brk
andsbrk
functions are historical curiosities left over from earlier days before the advent of virtual memory management.The current value of the program break is reliably returned by
sbrk(0)
.The
sbrk
function returns a pointer to the base of the new storage if successful; otherwise -1 witherrno
set to indicate why the allocation failed.
假设您使用:
void *base = sbrk(1024);
之后,假设没有错误,base
将包含 1024 字节(最小)内存块的起始地址; (char *)base + 1024
将超出您的要求,但它可能仍然有效,因为页面大小可能大于 1024。
它没有直接说明后续分配的地址是否比另一个分配更大或更小。但是,它很可能是按地址递增顺序排列的。
The
brk()
function sets the break or lowest address of a process's data segment (uninitialized data) to addr (immediately above bss). Data addressing is restricted betweenaddr
and the lowest stack pointer to the stack segment. Memory is allocated bybrk
in page size pieces; ifaddr
is not evenly divisible by the system page size, it is increased to the next page boundary.
这意味着额外的空间在 data 和 bss 段之后,并且向堆栈增长(在内存中向下增长)。但是,依靠那个可能是蛮干的。在调用sbrk(extra)
获得额外空间后,最好使用sbrk(0)
建立当前端;这会告诉您您真正得到了什么,这两个地址会告诉您它在哪里可用。
关于C: sbrk() 地址升序还是降序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21399590/
#include #include void *my_malloc(size_t size){ void *p; void *q; p = sbrk(0); /* If sbrk fails,
我的分配代码是 dat* data = NULL; data = sbrk(SIZE); if((int) data != -1){ return data }else{ printf("N
我想知道是否有人已经看到 sbrk(0) 失败? 我的意思是,如果你能达到这个功能,你显然之前就有访问内存的权限,所以检查当前的中断位置应该没问题,对吧? 编辑:例如,我应该考虑错误异常吗? 最佳答案
当 sbrk() 返回指向堆起始地址的指针时,地址是升序还是降序?例如,如果我有一个从地址 1 到 10 的 10 字节堆,sbrk() 会返回指向地址 10 或 1 的指针吗? 类似地,堆地址往往会
我在使用 sbrk 释放内存时遇到了问题。我向 sbrk 传递了一个负值,但它不会减少堆的开始。这是代码 int main(int argc, char** argv) { void * a
我正在尝试了解 sbrk 的工作原理。 这是我的小代码: int main() { printf("end of the break : %p\n", sbrk(0)); prin
因此,作为挑战和性能,我正在用汇编语言编写一个简单的服务器。我知道的唯一方法是通过系统调用。 (通过 int 0x80)显然,我将需要比在汇编或加载时分配的内存更多的内存,所以我阅读并决定我想使用 s
在32位Linux系统上,一个进程最多可以访问4GB的虚拟地址空间;然而,在保留其中任何一项方面,进程似乎在不同程度上是保守的。因此,使用 malloc 的程序偶尔会通过系统调用 sbrk/brk 增
我写了这个malloc的小版本(没有 free): #include #include #include #define word_size sizeof(intptr_t) #define a
我正在尝试在我的 mac(运行 Sierra)上构建一个大型 binutils 文件,每次尝试构建时,都会出现错误,提示“sbrk 已弃用”。我尝试在 Makefile 中的 CFLAGS 中添加“-
好的,所以我有一个看起来像的结构 typedef struct meta { size_t size; struct meta* next; struct meta* prev
我有一个游戏引擎,我想快速查看它使用了多少堆,所以我实现了这两个小例程 static void * start_memory = 0; unsigned long System::memoryUsag
我想知道是否有比malloc/free低一级的跨平台分配器。 例如,我想要一些在 Linux 中简单地调用 sbrk 并在 Windows 中调用 VirtualAlloc 的东西(可能还有两个类似的
以下是一个简单的 malloc 实现的代码。链表由用于内存管理的头指针和尾指针启动。现在在函数中,只有一个调用在列表未初始化时实现,即列表的头部被初始化。一旦我将底层指针返回到 main,程序就会给出
我的程序很简单, ... #define TO_INT(a) (*(int *)a) void *pool_head; void *pool_tail; ... pool_head = sbrk(BU
我尝试写一个非常简单的操作系统来更好地理解基本原理。我需要实现用户空间 malloc。所以一开始我想在我的 linux 机器上实现和测试它。 起初我通过以下方式实现了sbrk()函数 void* sb
我正在尝试创建我自己的 malloc 函数,但我还没有完成。这是我的代码的相关部分: mymalloc.h : #pragma once #include typedef struct METADA
我正在尝试使用 sbrk 系统调用请求一个内存页并将该页分成小块,但我的代码总是遇到一些无效内存: void sbrkBlocks() { int *b = sbrk(0); if(s
我想弄清楚可以使用 malloc() 为进程分配多少内存。 所以要点是: start = sbrk(0); malloc(1); /* so space is given to the data se
我有一个自定义分配器函数,它使用 sbrk() 来获取内存。当不再需要它时,如何释放它? 对于 malloc() 是否有等同于 free() 的函数? 还是我必须使用 brk() 来设置数据段的结尾?
我是一名优秀的程序员,十分优秀!