Относительно вашего второго вопроса ...
Вы можете malloc
в любом порядке, который вам нравится, но я обычно выделяю сам объект, прежде чем пытаться выделить любые субобъекты, потому что таким образом у вас есть четкоеместо для хранения результатов подобъекта malloc
s (в структуре) вместо необходимости хранить их в бесполезных временных переменных.
Убедитесь, что правильно обрабатываете свои ошибки - если второй malloc
завершится неудачно,вам нужно будет free
первый.На самом деле это место, которое многие программисты C любят использовать goto
:
struct Board *makeBoard(...)
{
struct Board *b = malloc(sizeof *b);
if(b == NULL) goto end1;
b->board = malloc(...);
if(b->board == NULL) goto end2;
// ...
end2:
free(b);
end1:
return NULL;
}
Когда вы free
данные, вам нужно free
подобъектов, прежде чем вы освободите главные объекты, если только выхраните указатели на все подобъекты во временных переменных перед free
основным объектом.То есть следующее не будет работать:
free(b);
free(b->board);
Поскольку, согласно второму утверждению, b
равно free
d и не может быть безопасно разыменовано.Лучше всего делать это в обратном порядке.