Запуск вашего кода через всегда полезный valgrind говорит:
==16066== Use of uninitialised value of size 8
==16066== at 0x40061B: dump_container (bug.c:33)
==16066== by 0x400726: main (bug.c:49)
==16066==
==16066== Invalid read of size 4
==16066== at 0x400620: dump_container (stdio2.h:105)
==16066== by 0x400726: main (bug.c:49)
==16066== Address 0x89485ed18949ed39 is not stack'd, malloc'd or (recently) free'd
==16066==
==16066==
==16066== Process terminating with default action of signal 11 (SIGSEGV)
==16066== General Protection Fault
==16066== at 0x400620: dump_container (stdio2.h:105)
==16066== by 0x400726: main (bug.c:49)
==16066==
Я предполагаю, что вы найдете ошибку в своем собственном коде, а не в компиляторе или отладчике.
РЕДАКТИРОВАТЬ Или, поскольку вы хотите, чтобы я разъяснил это для вас, измените строку 33 на
printf("foo[%d]=%d at %p\n", i, (*c->foos)[i]->i, (void*) (*c->foos)[i]);