Search code examples
clistruntime-error

Segmentation fault (core dumped) error in C when Implementing list ADT


I'm trying to implement a list ADT in C but I keep getting the error "Segmentation fault (core dumped)". I know it is caused by accessing memory that cannot be used, but I have no idea how to fix it (I am very new to data structures so sorry if there's an obvious error)

Here's the list.h file:

typedef struct node NodeType;

struct node {
  int num;
  NodeType *next;
};

typedef struct {
  int length;
  NodeType *head;
} List;

void init(int maxSize, List *L);
void print(List L); 

and this is the list.c file:

#include <stdio.h>
#include <stdlib.h>
#include "list.h"
void init(int maxSize, List *L) {
   (*L).length = maxSize;
   (*L).head=NULL;
}

void print(List L) {
 int i; 
 NodeType *p;

 printf("List is: ");
 for (i=0, p=L.head; i<L.length; i++, p=(*p).next) {
   printf(" %d ", (*p).num);
 }
 putchar('\n');
}

and this is the main file:

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


int main(void){
  List L;
  init(10, &L);
  //add(&L, 20); add(&L, 41); add(&L, 63);
  print(L);
  return 0;
}

what should I do? which part is exactly wrong?


Solution

  • Linked lists do not traditionally track their length. Length rather is calculated by iterating until we hit a null pointer.

    In your code, your init function sets the length of the list to 10. Then in print, you use this value to iterate 10 times, despite the fact that there are only 3 elements in your list. This is causing your segmentation fault.

    You can add a check to print to avoid this:

     for (i=0, p=L.head; i<L.length && p != NULL; i++, p=(*p).next) {
       printf(" %d ", (*p).num);
     }
    

    But I think you really need to rethink why you're initializing length to 10 at all, and why you're tracking the length of a list this way at all.