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
. - Внутри функции не указаны действия, которые должны выполниться при создании матрицы, поэтому мы не можем продолжить список.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д