簡體   English   中英

在 C 中不使用 malloc 將局部變量保存在堆上(使用 sbrk 或 brk)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM