c - 在 C 中使用 char 数组填充结构

标签 c memory memory-management

我正在用 C 语言编写一个简单的解释器,并且我不想处理内存管理,因此我正在编写一个简单的内存池来跟踪并减少 malloc 和 free 的数量。

typedef struct object {

    Type type;
    char data[128];
    struct object* next;

} Object;

typedef struct pool {

    Object* head;
    unsigned int used;
    Object* blocks;

} Pool;

如您所见,我的内存池目前只是一个“对象”的链接列表,每个对象的大小为 128 字节。

我的 init 和 malloc 函数如下:

#define BLOCK_COUNT 256

void* mp_init() {

    Pool* mp = malloc(1 * sizeof(Pool));

    mp->blocks = malloc(BLOCK_COUNT * sizeof(Object));

    mp->head = mp->blocks;
    mp->blocks->next = NULL;
    mp->used = 0;

    return mp;

}

void* mp_malloc(Pool* mp) {

    Object* obj = NULL;
    obj = (mp->blocks + mp->used);
    obj->next = (mp->blocks + (mp->used + 1) );
    obj->next->next = NULL;

    mp->used++;

    return obj;

}

我使用 char data[128] 强制所有对象的大小为 128 字节,我的 malloc 函数返回每个对象的地址,并且我在其中存储我想要的任何内容128 字节。这是不好的做法吗?仅使用数组来增加结构体的大小似乎很奇怪。

最佳答案

我认为你的代码是不好的做法。

  1. 如果您有数组( block ),则不需要链表。
  2. 在 init 方法中调用 malloc(BLOCK_COUNT * sizeof(Object)); 将 分配所有 block 。这将导致您的程序分配所有 开始时需要内存,这可能会浪费内存,如果 您并不确切知道您将需要多少内存。
  3. 您仍然需要管理池中的内存,因此没有必要拥有它。

您可能想做的是编写一个垃圾收集器。 然而,这并不是一件小事,需要很长时间才能在这里解释。

如果您不想这样做,我建议您使用不同的语言 内存管理。

否则您可能正在寻找具有以下形式的“变体”数组:

enum type {
    TYPE_1,
    ...
};

struct Object {
    enum type t;
    union {
       type_1 t1;
       ...
    };
};

关于c - 在 C 中使用 char 数组填充结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55318901/

相关文章:

c - 调试 - 字符串问题

memory - 计算外部/二级页表的大小

c - 动态数组和结构 C 的 Valgrind 内存泄漏

c++ - 如何在不循环的情况下仅计算数字的二进制表示形式中的 1 位

c - 通过 TCP 传输数据总是停止在 251 传输

html - 如果打开的选项卡过多,Chrome HTML5 视频将停止工作 - 内存问题?

xcode - 将单个文件转换成弧形?

ios - 我什么时候应该清除 iOS 应用程序的废弃数据?在启动或终止期间?

r - 仍在努力处理大数据集

c - dup2() 在 C 中做什么