как выделить память для самой структуры и ее членов

У меня есть эта структура:

struct foo { char *a; char *b; char *c; char *d; }; 

возможно выделить пространство для самой структуры и ее членов вместо, например,

 struct foo f; fa = malloc(); fb = malloc(); fc = malloc(); fd = malloc(); strcpy(fa, "a"); strcpy(fb, "b"); //.. 

что-то вроде этого (из того, что он не работает):

 struct foo f = malloc(sizeof(struct f)); strpcy(fa, "a"); //etc 

Это называется конструктором. Если ошибка обработки опущена, она может выглядеть так:

 struct foo *new_foo() { struct foo *obj = malloc(sizeof(struct foo)); obj->a = malloc(...); obj->b = malloc(...); obj->x = new_x(...); ... return obj; } 

и нужен соответствующий деструктор. Если вам нужно часто писать такой код, возможно, пришло время перейти на C ++ :).

Вы можете выделить память для самой структуры и ее членов за один раз, если это то, о чем вы просите. Вы просто должны знать, сколько вам понадобится (в целом), и позаботьтесь о любых возможных проблемах выравнивания (в данном случае этого нет).

 struct foo *f = malloc(sizeof *f + size_a + size_b + size_c + size_d); fa = (char*)(f + 1); // ... 

Это можно сделать, если вы знаете все «динамические» переменные размеры во время строительства.

 struct foo *f = malloc(sizeof(struct f) + nSizeExtra); f->a = (char*) (f + 1); f->b = ((char*) (f + 1)) + nLengthOfA; f->c = ((char*) (f + 1)) + nLengthOfA + nLengthOfB; f->d = ((char*) (f + 1)) + nLengthOfA + nLengthOfB + nLengthOfC; 

Конечно, в конце вы должны освободить только f (не его членов)

Конечно, вы можете выделить память для своей структуры и ее членов, но если вы выделите одну непрерывную память для всего этого, вам все равно потребуется инициализировать членов вашей структуры, чтобы вы не могли делать то, что хотите, так же легко, как и вы нравится.