sadfsy, выравнивание - это про начало выделенного куска. А не про конец или длину. Можно вполне себе иметь 4 байта, выравненных на 16 (начальный адрес имеет кучу нулевых бит в конце.
Но даже если вы вылелите память с запасом, работать будет не правильно. Так, для (0, 0) вы возьмёте все 4 числа в матрице, хотя там только 2 слагаемых должно быть.
Т.е вам придется делать запас в каждой строке матрицы.
Ну, и одну матрицу надо транспонировать. А то у вас строка на строку умножается, а надо - строку на столбец.
Сразу видно, что код - копипаста :) Берете в зубы gdb и - по операторам шагать, выясняя, что и как делается, заодно и в коде разберетесь, чтобы на защите не краснеть :)