1) Нельзя задавать значения по умолчанию для конкретной структуры для ее элементов на уровне языка, поскольку все переменные в C неинициализированы, если вы явно не инициализируете их (или не делаете их статическими / внешними, в этом случае они инициализируем). Если вы спроектируете свои структуры так, чтобы все нули были хорошим набором начальных значений, вы всегда можете инициализировать так:
struct foo myfoo = {0};
{0}
служит универсальным инициализатором нуля, который работает для любого типа.
Если вам нужны разные значения по умолчанию, лучше всего использовать макрос и документировать, что код, использующий вашу структуру, должен использовать макрос:
#define FOO_INITIALIZER { 1, 2, 3 }
struct foo myfoo = FOO_INITIALIZER;
2) Если вы знаете, прежде чем начать использовать какую-либо структуру, сколько вам понадобится, просто malloc
их все, как только вы знаете число:
if (count > SIZE_MAX / sizeof *bar) abort();
struct foo *bar = malloc(count * sizeof *bar);
Обратите внимание на правильную идиому для вызова malloc
и избежания уязвимостей переполнения.
Если вы не знаете нужного вам числа, пока не начнете с ними работать, начните с выделения приличного числа, а если закончите, увеличьте число на фиксированное значение, например, удвоив размер обычный и легкий Вы хотите проверить наличие переполнений здесь. Затем используйте realloc
.