【问题标题】:C write struct in arrayC在数组中写入结构
【发布时间】:2014-03-01 00:11:27
【问题描述】:

我需要将自制的malloc 简化一点。内存池只是一个无符号字符数组。我打算有一个结构体,它是一个标头,包含内存块的大小、一个标志('A' 代表已分配,'F' 代表免费)和一个指向下一个标头的指针(尽管我猜这是' t 是必要的,因为你已经有了块的长度)

Anywho,我不知道如何轻松地将结构存储在内存池中。这是我当前的代码:

#include <stdlib.h>
#include <stdio.h>

#include "ex1.h"

#define POOL_SIZE 500


unsigned char mem_pool[POOL_SIZE];
unsigned char *ptr = &mem_pool[0];

typedef struct header Header;

Header h;

struct header{
    int size;
    char flag;
    Header * next;
};

void ma_init(){
    h = (Header){ .size = POOL_SIZE - sizeof(Header), .flag = 'F', .next = NULL};
}

现在h 标头当然不在 mem_pool 中。从逻辑上讲,初始化应该是mem_pool[0] = (Header){ ...,因为这是mem_pool 的第一个字段。当然,我可以将指针放在数组中,但这会破坏具有 mem_pool 的 aspec tof。

那么我应该如何将结构(或其他)存储在数组的某个位置?

【问题讨论】:

  • 可能是分配记录的链接列表,位于池的开头还是池外?

标签: c arrays pointers struct


【解决方案1】:

您的内存池只是一块分配的内存,您可以随意以任何方式处理和解释该内存的任何部分,您只需要小心记账。

所以你可以声明你的内存池的第一个字节是你的头结构的第一个字节:

struct header *h = (struct header *)mem_pool;
h->flag = 'F';
// this will be set after you allocate the first block
// you would set it to h + sizeof(struct header) + allocation size
h->next = NULL;    

只要你有你的 blob 的开头并且你的大小/指针是正确的,你就可以继续将适当的内存 blob 作为你的struct

【讨论】:

  • 这仅在mem_poolstruct header * 正确对齐时有效,否则行为未定义。由于mem_pool 是一个字符类型的数组,它可能没有正确的对齐方式。确保mem_pool 具有正确对齐的一种方法是使其成为还包含指针的联合的成员。或者,如果使用malloc 分配池,那也可以工作,因为malloc'd 的内存保证可以针对任何类型正确对齐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多