Segmentation fault. Присвоение значений элементам структуры - C (СИ)
Формулировка задачи:
Компилируется как надо. На винде падает после запуска, на линуксе после запуска выдает sigmentation fault (Ошибка сегментирования. Сделан дамп памяти). Очевидно, что проблема в неверном присваивании значений элементам объекта типа Matrix. Но как правильно присвоить значения не могу понять. Прошу подсказать, в чем дело.
П.С. Знаю, что можно сделать без структур и в функции выделения дин.памяти обойтись без указателей, но наличие typedef struct, названия функций и передаваемые в них значения были в шаблоне задания.
#include <stdio.h>
#include <stdlib.h>
typedef struct Matrix
{
double **values;
int col;
int row;
} Matrix;
Matrix *matrix;
Matrix *create_matrix(int row, int col)
{
Matrix *matrix;
double **matrix_array = (double**)malloc(row*sizeof(double*));
int k;
for(k = 0; k<=row; k++)
{
matrix_array[k] = (double *)malloc(col*sizeof(double));
}
if(matrix_array ==NULL)
{
printf("Not enough memory!\n");
}
matrix->row = row;
matrix->col = col; //Видимо, вот в этих присваиваниях основная проблема.
matrix->values = matrix_array;
return matrix;
}
void *create_matrix_from_file(FILE* file)
{
int i, k, row, col;
if(file == NULL)
{
printf("Can not open file");
}
else
{
fseek(file , 0 , SEEK_END);
long lSize = ftell(file);
rewind (file);
int buff[lSize];
for(i = 0; i<lSize; i++)
{
fscanf(file, "%i", &buff[i]);
}
row = buff[0];
col = buff[1];
printf("\n*************\n");
Matrix *matrix = create_matrix(row, col);
//
printf(" !!!row = %i\n", matrix->row);
printf("!!!col = %i\n", matrix->col);
k = 2;
int j;
for(i = 0; i< row; i++)
{
for(j = 0; j< col; j++)
{
matrix->values[i][j] = buff[k];
k++;
printf("%.01lf ", matrix->values[i][j]);
}
printf("\n");
}
}
}Решение задачи: «Segmentation fault. Присвоение значений элементам структуры»
textual
Листинг программы
Matrix *create_matrix(int row, int col)
{
Matrix *matrix;
...
matrix->row = row;
...
Объяснение кода листинга программы
- В функции
create_matrixсоздается указательmatrixна структуруMatrix. - Внутри функции не указаны действия, которые должны выполниться при создании матрицы, поэтому мы не можем продолжить список.