malloc - how do I allocate memory for some of the structure elements -
i want allocate memory elements of structure, pointers other small structs.how allocate , de-allocate memory in best way?
ex:
typedef struct _some_struct { pdatatype1 pdatatype1; pdatatype2 pdatatype2; pdatatype3 pdatatype3; ....... pdatatype12 pdatatype12; } some_struct, *psome_struct;
i want allocate memory pdatatype1,3,4,6,7,9,11.can allocate memory single malloc? or best way allocate memory these elements , how free whole memory allocated?
there is trick allows single malloc
, has weighed against doing more standard multiple malloc
approach.
if [and only if], once datatypen
elements of some_struct
allocated, not need reallocated in way, nor any other code free
on of them, can following [the assumption pdatatypen
points datatypen
]:
psome_struct alloc_some_struct(void) { size_t siz; void *vptr; psome_struct sptr; // note: optimizes down 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 struct pointed sptr->pdatatype1 here or // caller should -- likewise others ... vptr += sizeof(datatype1); sptr->pdatatype2 = vptr; vptr += sizeof(datatype2); sptr->pdatatype3 = vptr; vptr += sizeof(datatype3); ... sptr->pdatatype12 = vptr; vptr += sizeof(datatype12); return sptr; }
then, when you're done, free(sptr)
.
the sizeof
above should sufficient provide proper alignment sub-structs. if not, you'll have replace them macro (e.g. sizeof
) provides necessary alignment. (e.g.) 8 byte alignment, like:
#define sizeof(_siz) (((_siz) + 7) & ~0x07)
note: while possible this, , more common things variable length string structs like:
struct mystring { int my_strlen; char my_strbuf[0]; }; struct mystring { int my_strlen; char *my_strbuf; };
it debatable whether it's worth [potential] fragility (i.e. forgets , realloc/free
on individual elements). cleaner way embed actual structs rather pointers them if single malloc
high priority you.
otherwise, the [more] standard way , 12 individual malloc
calls and, later, 12 free
calls.
still, is viable technique, particularly on small memory constrained systems.
here [more] usual way involving per-element allocations:
psome_struct alloc_some_struct(void) { void *vptr; psome_struct sptr; sptr = malloc(sizeof(some_struct)); // either initialize struct pointed sptr->pdatatype1 here or // caller should -- likewise others ... sptr->pdatatype1 = malloc(sizeof(datatype1)); sptr->pdatatype2 = malloc(sizeof(datatype2)); sptr->pdatatype3 = malloc(sizeof(datatype3)); ... sptr->pdatatype12 = malloc(sizeof(datatype12)); return sptr; } void free_some_struct(psome_struct sptr) { free(sptr->pdatatype1); free(sptr->pdatatype2); free(sptr->pdatatype3); ... free(sptr->pdatatype12); free(sptr); }
Comments
Post a Comment