in identity_matrix
Ваш индекс цикла неверен:
for (j = 0; i < mat.N; j++)
должен быть
for (j = 0; j < mat.N; j++)
, поэтому он переполняет память, и вы получаете неопределенное поведение
Обратите внимание, что я не обнаружил, что ваш код выглядел хорошо.Сначала я скомпилировал его с включенной отладкой и всеми предупреждениями
$ gcc -g -Wall test.c
Никаких предупреждений, хорошо, поэтому я просто отладил вашу программу , используя командную строку:
$ gdb a
blah blah blah ....
Reading symbols from a...done.
(gdb) r 3
Starting program: L:\so\a.exe 3
[New Thread 7364.0x68c]
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401686 in identity_matrix (mat=...) at test.c:40
40 mat.m[i * mat.N + j] = 0;
(gdb) p mat
$1 = {N = 3, m = 0x3928b0}
(gdb) p i*mat.N + j
$2 = 1770
(gdb)
Либо мне повезло, либо конфигурация памяти была другой, но программа вылетала там, где была ошибка.