"Marking" C 中的指针 "attributes"

"Marking" Pointers in C with "attributes"

我在堆上有一个用 malloc 分配的巨大缓冲区,我想编写一个自定义分配器从该缓冲区分配 space。

我现在的问题是,是否有办法在该缓冲区中 "mark" 某些区域,例如 "allocatable"、"writable" 和 "reserved",就像在内核开发中一样。

例如,我们有一个包含 6 个元素的缓冲区,我如何将元素 2-5 标记为 "reserved"?

   [0][1][2][3][4][5]

是否可以使用标志、位操作或其他方式? 或者我可以标记指针吗?

您可以使用像 struct(或 linked list)数组这样简单的东西,它在每个实例中包含一个标志,您可以设置该标志来指示是否允许分配。
例如,使用标志和模糊类型 (void *):

typedef struct {
    BOOL alloc; //set TRUE to allow or FALSE to disallow further allocation
    void *space;
    //other members
}BUF;

创建一个 BUF 的数组,并将 alloc 成员设置为 TRUEFALSE 以设置实例不再可访问以更改其内存。当然,这会在初始化期间分配初始内存后发生。

或者另一种使用 enum 类型的可能性,结合 union:

typedef enum {
    _INT,
    _UINT,
    _CHAR,
    _UCHAR,
    ... //other types
}TYPE;

typedef struct {
    BOOL alloc; //set to allow or disallow further allocation
    TYPE type;  //flag to track type being used in instance
    union {
        char *cMem;
        unsigned char *ucMem;
        int *iMem;
        unsigned int *uiMem;
        ... // other members

    char *space;
}BUF;

将buffer的个数转换成unsigned int的位数组,并用内存索引来标记。 例如:unsigned int allocatable [((x) +31)>>5]; 可写和保留类似。