Вам нужно:
struct group *g = NULL;
вы передаете неинициализированный указатель на realloc()
, что является неопределенным поведением.
Также обратите внимание, что если всегда будет 2 человека, лучше просто сделать:
struct people peoples[2];
внутри структуры, чтобы сократить выделение кучи и упростить задачу.
Также принято / стандартно не делать перераспределение по одному элементу за раз, а вместо этого позволить ему расти экспоненциально, удваивая размер при каждой новой потребности в выделении или, наконец, добавляя большее количество элементов. Это связано с тем, что выделение динамической памяти является дорогостоящим (на это требуется время), поэтому для производительности полезно сделать меньше распределений, если это возможно. Конечно, это требует отслеживания фактического используемого / действительного массива отдельно от выделенной длины.