C - Утечка памяти при добавлении элементов к нечетным индексам в массиве связанных списков, но не даже - PullRequest
1 голос
/ 04 мая 2020

У меня есть простая структура связанного списка, называемая node, массив головных узлов, функция connectedListManage и функция addNode, однако я был бы признателен за помощь в диагностике проблемы с ошибками сегмента, которую я не понимаю.

Я проследил проблему при добавлении узлов в оператор main:

while(1) linkedListManage(*heads);

Хотя указатель на заголовки включен, я получаю segfault всякий раз, когда добавляю второй элемент (никогда не первый) к любому связанному заголовок списка, который хранится в ODD INDEX (никогда не возникает проблем с четным индексом) в моем массиве заголовков связанных списков. Я проверил это с размером массива 20 для головы, и проблема все еще сохраняется, чтобы влиять только на нечетные индексы.

Однако, когда я удаляю указатель на головы:

while(1) linkedListManage(heads);

это устраняет ошибку segfault и позволяет моим спискам правильно добавляться, но затем выдает 2 предупреждения:

main.c:42:27: warning: incompatible pointer types passing 'node *[2]' to parameter of type
      'node *' (aka 'struct node_t *') [-Wincompatible-pointer-types]
  while(1) linkedListManage(heads);
                          ^~~~~
main.c:27:27: note: passing argument to parameter 'heads' here
void linkedListManage(node* heads){

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

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

typedef struct node_t{
  int data;
  struct node_t* next;
} node;

void addNode(node* a){
  int userInput;

  node* current = a;

  printf("Enter value: ");
  scanf("%d", &userInput);    

  if (!current->data) current->data = userInput;
  else { 
    while(current->next) current = current->next;

    node* newNode = (node*)malloc(sizeof(node));
    newNode->data = userInput;
    current->next = newNode;
  }
}

void linkedListManage(node* heads){
    int userInput;

    printf("Enter ID of list:\n");

    scanf("%d", &userInput);

    addNode(&heads[userInput]);
}

int main(){
  node* heads[2];
  heads[0] = (node*)malloc(sizeof(node));
  heads[1] = (node*)malloc(sizeof(node));

  while(1) linkedListManage(heads);

  return 0;
}

1 Ответ

0 голосов
/ 04 мая 2020
while(1) linkedListManage(heads);

должно быть

while(1) linkedListManage(heads[1]);

, иначе вы передаете node ** функции, которая ожидает node *.

...