如何为某些结构元素

时间:2016-05-25 01:26:12

标签: memory-management malloc structure dynamic-memory-allocation calloc

我想为结构的某些元素分配内存,这些元素是指向其他小结构的指针。如何以最佳方式分配和取消分配内存?

例如:

 typedef struct _SOME_STRUCT {
    PDATATYPE1   PDatatype1;
    PDATATYPE2   PDatatype2;
    PDATATYPE3   PDatatype3;

    .......

    PDATATYPE12   PDatatype12;
} SOME_STRUCT, *PSOME_STRUCT;

我想为PDatatype1,3,4,6,7,9,11分配内存。我可以用单个malloc分配内存吗?或者只为这些元素分配内存以及如何释放分配的整个内存的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

一个允许单个malloc的技巧,但这也必须权衡更多标准的多malloc方法。

如果 [和 if],一旦分配了DatatypeN的{​​{1}}元素,它们就不会需要以任何方式重新分配,任何其他代码也不会对其中的任何代码执行SOME_STRUCT,您可以执行以下操作[假设free指向{ {1}}]:

PDATATYPEn

然后,当你完成时,只需DATATYPEn

上面的PSOME_STRUCT alloc_some_struct(void) { size_t siz; void *vptr; PSOME_STRUCT sptr; // NOTE: this optimizes down to a single assignment siz = 0; siz += sizeof(DATATYPE1); siz += sizeof(DATATYPE2); siz += sizeof(DATATYPE3); ... siz += sizeof(DATATYPE12); sptr = malloc(sizeof(SOME_STRUCT) + siz); vptr = sptr; vptr += sizeof(SOME_STRUCT); sptr->Pdatatype1 = vptr; // either initialize the struct pointed to by sptr->Pdatatype1 here or // caller should do it -- likewise for the others ... vptr += sizeof(DATATYPE1); sptr->Pdatatype2 = vptr; vptr += sizeof(DATATYPE2); sptr->Pdatatype3 = vptr; vptr += sizeof(DATATYPE3); ... sptr->Pdatatype12 = vptr; vptr += sizeof(DATATYPE12); return sptr; } 应足以为子结构提供正确的对齐方式。如果没有,您必须使用提供必要对齐的宏(例如free(sptr))替换它们。 (例如)8字节对齐,类似于:

sizeof

注意:虽然可以做到这一切,但对于像变长字符串结构这样的事情更常见:

SIZEOF

它是否值得[潜在]脆弱性(即有人忘记并对个别元素进行#define SIZEOF(_siz) (((_siz) + 7) & ~0x07) )值得商榷。更简洁的方法是嵌入实际的结构而不是指针,如果单struct mystring { int my_strlen; char my_strbuf[0]; }; struct mystring { int my_strlen; char *my_strbuf; }; 是您的高优先级。

否则,只需按[更多]标准方式执行12个单独的realloc/free来电,然后进行12个malloc来电。

仍然, 是一种可行的技术,特别是在小内存受限系统上。

以下是涉及每元素分配的[更多]常用方法:

malloc

答案 1 :(得分:0)

如果您的结构包含其他结构作为元素而不是指针,您可以一次性为组合结构分配内存:

typedef struct _SOME_STRUCT {
    DATATYPE1   Datatype1;
    DATATYPE2   Datatype2;
    DATATYPE3   Datatype3;

    .......

    DATATYPE12   Datatype12;
} SOME_STRUCT, *PSOME_STRUCT;

PSOME_STRUCT p = (PSOME_STRUCT)malloc(sizeof(SOME_STRUCT));

// Or without malloc:
PSOME_STRUCT p = new SOME_STRUCT();