WedX - журнал о программировании и компьютерных науках

есть некоторая проблема с выделением памяти, ошибка сегментации

Я написал этот код для реализации разреженной матрицы с использованием связанного списка, но я не понимаю, почему я получаю сообщение об ошибке (ошибка сегментации)..... может кто-нибудь помочь мне с этим.

Я создал массив связанного списка, индекс массива представляет собой строку матрицы, а в связанном списке я храню столбец и значение данных.

Ниже есть ссылка на изображение, которое может помочь вам лучше понять код.

https://i.stack.imgur.com/9rwH9.png

#include <stdio.h>
#include<stdlib.h>

struct Node {
  int col;
  int data;
  struct Node *next;
}*first;

void Create(struct Node **A, int m, int n) {
  struct Node  *t, *last;
  printf("Enter the elements of sparse matrix:\n");
  for(int i=0; i<m; i++){
    first = NULL;
    last = NULL;
    for(int j=0; j<n; j++){
      int val;
      scanf("%d", &val);
      if(val != 0){
        t= (struct Node *)malloc(sizeof(struct Node));
        t->col = j;
        t->data = val;
        t->next = NULL;

        if(first) 
          first = t;
        if(last)
          last->next = t;
        last = t;
      }
    }
    A[i] = first;
  }
  return;
}

void Display(struct Node **A, int m, int n){
  printf("\nSparse matrix is:\n");
  for(int i=0; i<m; i++){
    struct Node *p = A[i];
    for(int j=0; j<n; j++){
      if(p->col == j){
        printf(" %d ", p->data);
        if(p)
          p = p->next;
      }
      else printf(" 0 ");
    }
    printf("\n");
  }
}

int main() {
  int m=5, n=6;
  struct Node **A = (struct Node **)malloc(m * sizeof(struct Node));
  Create(A, m, n); 
  Display(A, m, n);
  return 0;
}

  • Значение first всегда равно NULL, потому что if(first) всегда равно false. В конце концов вы назначаете A[i] = first; и, возможно, разыменовываете его позже. Вы намеревались if(!first) ? 17.03.2021
  • if(first) first = t; странно. Если first равно NULL, то остается NULL 17.03.2021
  • Это выражение: struct Node **A = (struct Node **)malloc(m * sizeof(struct Node)); неверно, вам нужен размер указателя, sizeof(struct Node*) или лучше sizeof *A. 17.03.2021

Ответы:


1

Есть три вещи, чтобы исправить ваш код:

  • Когда вы выделяете, вы должны выделить место для типа данных, на который указывает дескриптор памяти, в вашем случае struct Node *:

    struct Node **A = malloc(m * sizeof(struct Node *));
    

    Вы можете написать это как:

    struct Node **A = malloc(m * sizeof(*A));
    

    Вы также должны free использовать все выделенные данные после их использования. (Неправильное выделение здесь не помешает, потому что вы выделяете больше, чем нужно, но если вы ошибетесь с типами и выделите слишком мало, вас ждут сюрпризы.)

  • Когда вы вставляете первый узел, head равно нулю, поэтому это условие нужно проверить:

    if (first == NULL) 
      first = t;
    

    Ваш исходный код никогда не добавляет узлы в список.

  • При печати вы получаете доступ к p, но p может быть нулевым. Это самое первое, что вы должны проверить перед любым доступом к p:

    if (p && p->col == j){
      printf(" %d ", p->data);
      p = p->next;
    }
    
17.03.2021
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]