Ошибка сегментирования при работе с матрицей - 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.