В дополнение к комментариям, есть несколько вопросов, связанных с проверки что будет кусать вас, если вы не проверить. В первую очередь вы сталкиваетесь с двумя такими проблемами в своем коде (которые применяются каждый раз, когда вы это делаете).
(1) Всегда проверяйте КАЖДОЕ распределение. Как заметил @AnT, проверка if(mat1 != NULL)
уже слишком поздняя. Вы должны проверить каждое распределение. например
/* allocate & VALIDATE */
if (!(mat1 = malloc (size * sizeof *mat1))) {
fprintf (stderr, "error: virtual memory exhausted.\n");
return 1;
}
и
for (i = 0; i < size; i++) /* allocate & VALIDATE */
if (!(mat1[i] = malloc (size * sizeof **mat1))) {
fprintf (stderr, "error: virtual memory exhausted.\n");
return 1;
}
(2) Всегда проверять все входные пользователя. (для всех, кого вы знаете, есть кошка, ступающая по клавиатуре). Это тоже непростая задача:
/* Enter the input matrix */
printf ("\nEnter the elements of matrix\n");
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++)
if (scanf ("%lf", &mat1[i][j]) != 1) { /* VALIDATE */
fprintf (stderr, "error: invalid conversion.\n");
return 1;
}
}
Если вы следуете этим двум правилам, время отладки будет значительно уменьшено. (не говоря уже о том, что ваш код будет надежным).
Если вы выделите память, не забудьте ее free
. Несмотря на то, что в этом небольшом фрагменте кода память освобождается при выходе. Но когда вы начинаете писать функции, выделяющие память, если вы еще не привыкли отслеживать и освобождать свои ассигнования, вы просто просите о проблемах.
Наконец, вы всегда можете бросить putchar ('\n')
в свой контур печати, чтобы привести в порядок вещи. например
/* Printing Input Matrix */
printf ("\n Entered Matrix 1: \n");
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++)
printf (" %6.2lf", mat1[i][j]);
putchar ('\n');
}
Пример использования/вывода
$ ./bin/matrixdbg
Enter the matrix size: 2
Enter the elements of matrix
1.1
2.2
3.3
4.4
Entered Matrix 1:
1.10 2.20
3.30 4.40
удачи с вашим кодирования. Дайте мне знать, если у вас возникнут дополнительные вопросы.
Вы используете неправильный спецификатор для 'scanf' и' printf', '% d' предназначен для целых чисел со знаком, попробуйте с'% g' – Jack
Кроме того, я слышал, что значения возврата металока-отливки не являются хорошей идеей в C. – synchronizer
[не бросать malloc] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Barmar