Ошибка сегментирования при работе с матрицей - C (СИ)
Формулировка задачи:
Матрица m на n Ошибка сегментирования в строке 25. Подскажите где ошибка?
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Matrix { int m, n; double **matrix; double *data ; } Matrix; Matrix * createMatrix ( int m, int n ) { Matrix *matrix = malloc(sizeof(Matrix)*m*n); if (!matrix) { printf("malloc error\n"); return NULL; } matrix->data = malloc(sizeof(double)*n); if (!matrix->data) { printf("malloc error\n"); return NULL; } int i, j; for (i=0; i<m; i++){ for (j=0; j<n; j++){ matrix->matrix[i][j]='0'; } } for (i=0; i<m; i++){ for (j=0; j<n; j++){ printf ("Stop5 \n"); } printf("\n"); } return matrix; } void destroyMatrix ( Matrix* matrix ){ free(matrix->data); free(matrix); } int main(int argc, char *argv[]) { if (argc!=3) { printf("\nОшибка количества аргументов: \n"); exit(EXIT_FAILURE); } int p; int k; p=atoi(argv[1]); k=atoi(argv[2]); createMatrix ( p, k ); return 0; }
Решение задачи: «Ошибка сегментирования при работе с матрицей»
textual
Листинг программы
typedef struct Matrix { int m, n; double **matrix; double *data; } Matrix; Matrix * createMatrix ( int m, int n ) { int i, j; Matrix *mat = malloc(sizeof(Matrix)); if (!mat) { printf("malloc error\n"); return NULL; } mat->m = m; mat->n = n; mat->matrix = malloc(sizeof(double*)*m); if (!mat->matrix) { printf("malloc error\n"); return NULL; } mat->data = malloc(sizeof(double)*m*n); if (!mat->data) { printf("malloc error\n"); return NULL; } for (i=0; i<m; i++) { mat->matrix[i]=mat->data+i*n; } for (i=0; i<m; i++) { for (j=0; j<n; j++) { mat->matrix[i][j]=i*10+j; } } for (i=0; i<m; i++){ for (j=0; j<n; j++){ printf (" %f",mat->matrix[i][j]); } printf("\n"); } return mat; } void destroyMatrix ( Matrix* mat ){ free(mat->data); free(mat->matrix); free(mat); }
Объяснение кода листинга программы
- Создание структуры Matrix, которая содержит информацию о размере матрицы и указатели на ее элементы.
- Создание функции createMatrix, которая создает матрицу заданного размера и заполняет ее значениями.
- Выделение памяти под матрицу и данные с помощью функции malloc.
- Присваивание значений переменным m и n, которые хранят размер матрицы.
- Создание двумерного массива double **matrix и выделение под него памяти с помощью функции malloc.
- Создание одномерного массива double *data и выделение под него памяти с помощью функции malloc.
- Заполнение матрицы значениями с помощью двух вложенных циклов.
- Вывод значений матрицы на экран с помощью функции printf.
- Создание функции destroyMatrix, которая освобождает память, выделенную под матрицу.
- Освобождение памяти под матрицу и данные с помощью функции free.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д