![](/img/trans.png)
[英]How to access memory dynamically without using dynamic allocator include the brk, sbrk and mmap
[英]Save a local variable on a heap without using malloc in C (using sbrk or brk)
我有一個結構如下:
struct
__attribute__((__packed__)) // compiler directive, avoid "gcc" padding bytes to struct
meta_data {
size_t size; // 8 bytes (in 64-bit OS)
char free; // 1 byte ('f' or 'o')
};
該結構的大小為 9 個字節。
我想使用 sbrk 或 brk 在堆上分配 9 個字節並在堆上保存一個結構,並返回指向堆上動態分配的 memory 塊的指針。
目前我有這樣的事情:
void *add(size_t size) {
void* returnPointer;
returnPointer = sbrk(9);
struct meta_data newMetadata;
newMetadata.size = size;
newMetadata.free = 'o';
return returnPointer;
}
這個 function 應該可以多次使用,以在堆上添加更多元數據塊。
但是,在這種情況下,當function結束時,function內部聲明的局部變量newMetadata也被終止。
我怎樣才能將它保留在堆上而不失去對創建的新元數據的訪問權限?
注意:我不允許為此使用 malloc。
通常的方法是模仿一些malloc
包的作用。 也就是說,將元數據放在比作為“數據”指針返回的地址更低的地址。
這是您重構的代碼以執行此操作:
#include <unistd.h>
struct meta_data {
size_t size; // 8 bytes (in 64-bit OS)
char free; // 1 byte ('f' or 'o')
// compiler directive, avoid "gcc" padding bytes to struct
} __attribute__ ((__packed__));
void *
add(size_t size)
{
struct meta_data *meta;
void *returnPointer;
meta = sbrk(sizeof(struct meta_data) + size);
meta->size = size;
meta->free = 'o';
returnPointer = meta;
returnPointer += sizeof(struct meta_data);
return returnPointer;
}
請注意,大多數malloc
替換將保證returnPointer
是“出於任何目的對齊”,這通常意味着對齊到 8 字節邊界(即returnPointer
的低 3 位為 0)。
上面的代碼沒有這樣做,所以你可以 [later] 添加它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.