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

Объяснение кода листинга программы

  1. Создание структуры Matrix, которая содержит информацию о размере матрицы и указатели на ее элементы.
  2. Создание функции createMatrix, которая создает матрицу заданного размера и заполняет ее значениями.
  3. Выделение памяти под матрицу и данные с помощью функции malloc.
  4. Присваивание значений переменным m и n, которые хранят размер матрицы.
  5. Создание двумерного массива double **matrix и выделение под него памяти с помощью функции malloc.
  6. Создание одномерного массива double *data и выделение под него памяти с помощью функции malloc.
  7. Заполнение матрицы значениями с помощью двух вложенных циклов.
  8. Вывод значений матрицы на экран с помощью функции printf.
  9. Создание функции destroyMatrix, которая освобождает память, выделенную под матрицу.
  10. Освобождение памяти под матрицу и данные с помощью функции free.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы