Является ли ошибка сегментации в конце кода (только для выделения памяти в 2D-массив и печати результата)? Заканчивается последний оператор printf
, и любой код, который я добавляю в конце, успешно завершается, а затем появляется segfault.Ошибка сегментации в конце программы C
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n,i,j,**mat;
printf("\nEnter the size of the square matrix: ");
scanf("%d",&n);
*mat = (int **)malloc(n*sizeof(int *));
for(i=0;i<n;i++)
{
mat[i]= (int *)malloc(n*sizeof(int));
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%d\t",mat[i][j]=rand()%10*i+j);
printf("\n\n\n");
}
printf("Bye\n");
return 0;
}
Технически *mat
в 8-й строке (напечатанной в коде), должны быть mat
, но потом все нормально. Указанный код компилируется (с очевидным предупреждением о несовместимом типе указателя в gcc) и работает, кроме как в конце, когда он печатает segfault. Если бы в программе было segfault, это не дошло бы до конца!
Одним из возможных объяснений является то, что адрес возврата из 'main' был перезаписан в стеке, поэтому он дает segfault в конце функции' main'; вероятно, из-за неправильного использования указателя. – m0skit0
Поскольку вы, по-видимому, знаете, что «' * mat' в 8-й строке (напечатан в коде) должен быть «матом», что именно ваш вопрос? –
Ваше использование '* mat' вызывает неопределенное поведение. Переменная 'mat' неинициализирована; вы разыгрываете его. Все может случиться.Код сломан. В любом случае, вы должны были использовать 'mat = malloc (n * sizeof (* mat));' если вы не используете компилятор C++ для компиляции C, в этом случае вам нужен приведение. –