buildings = realloc(buildings, i+1);
Это неправильно. Должно быть:
buildings = realloc(buildings, sizeof(struct B) * (i+1));
Есть похожая проблема с этим:
humans = realloc(humans, n+1);
Кроме того, этот код полностью сбивает с толку. Я не могу предложить, как это исправить, потому что я понятия не имею, что вы думаете, это делает:
buildings[i].ptra = (*buildings->ptra) calloc(1, buildings->ptra);
buildings[i].ptra = &(humans[n]);
buildings[i].ptra = strdup("NameXYZ");