Как уже упоминалось, код использует неправильный размер для 1-го распределения.
Чтобы никогда больше не думать о том, какой размер использовать при распределении, есть простой трюк:
Учитывая, что результатвыделения памяти всегда назначается указателю, просто запросите выделение (кратное) размера, на который указывает целевой указатель, выполнив:
int **wagner;
wagner = calloc(sizeofvstup1 + 1, sizeof *wagner);
for (size_t = 0; i < (sizeofvstup1 + 1); ++i) {
wagner[i] = calloc(sizeofvstup2 + 1, sizeof *wagner[i]);
}
(все другие изменения вкод не имеет отношения к этой «уловке»)
Таким образом, код может даже пережить изменение с
int ** wagner;
, скажем,
double ** wagner;
без любых модификаций.