0

I am trying to do an exercise on C. There are two arrays, count and list. count is an array of ints initially filled with 0, while list is an array of queues. My code is supposed to take pairs of numbers separated by a space eg. "1 2". For every pair of numbers, I must add 1 to the 2nd number-1 position in the count array, and then put a node containing the 2nd number in the head of the queue in the 1st number-1 position of the list array. My code is down below, and it results to a segmentation error after receiving the first pair of numbers. Removing lines 24-30 removes the error, but I don't understand what causes this error. Can anyone point out why it's doing a segmentation error?

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

typedef struct node Node;
struct node {
  int succ;
  Node *next;
};

void set_initial_array(int count[], int n, Node *list[]);
void handle_input(char string[], int count[], Node *list[]);

void set_initial_array(int count[], int n, Node *list[]) {
  for (int i = 0; i < n; i++) {
    count[i] = 0;
    list[i] = NULL;
  }
}

void handle_input(char string[], int count[], Node *list[]) {
  int j = atoi(&string[0]), k = atoi(&string[2]);
  count[k - 1]++;
  if (list[j - 1] != NULL) { // Removing line 24-30 removes error
    Node head = {k, list[j - 1]};
    list[j - 1] = &head;
  } else {
    Node head = {k, NULL};
    list[j - 1] = &head;
  }
}

int main() {
  char string[4];
  int count[15];
  Node *list[15];
  set_initial_array(count, n, list); //fill count with 0 and list with NULL
  while (fgets(string, 4, stdin) != NULL && strcmp(string, "0 0") != 0) {
    handle_input(string, count, list);
  }
}
2
  • 4
    How does this even compile, there is no variable n in main? Commented Nov 5, 2020 at 15:16
  • 1
    Non-static local variables will be invalidated on returning from the functions in which they are declared and storing pointers to them to variables that survive after returnig is not a good idea. Commented Nov 5, 2020 at 15:16

1 Answer 1

1

There is a problem here:

Node head = {k, list[j - 1]};
list[j - 1] = &head;

head is a local variable, which will go of scope (or in simple terms: it will be destroyed) as soon as the handle_input function returns.

In this line list[j - 1] = &head; you store the address of that local variable in the list array which points actually to an array provided in main.

You need to handle this differently by allocating memory:

Node *head = malloc(sizeof(*head));
head->succ = k;
head->next = list[j - 1]
list[j - 1] = head;

There may be other problems though, I didn't check.

Don't forget to free the allocated memory at some point in main.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.