Ошибка сегментации (ядро сброшено) с помощью malloc и struct - PullRequest
0 голосов
/ 03 мая 2018

Я не могу понять, почему этот простой код не запускается, не вызывая ошибки сегментации в Linux:

#include <stdlib.h>

struct entry
{
   int value;
};

void initEntry(struct entry *entry)
{
  entry = malloc(sizeof(struct entry));    
  entry->value = 0;
}

int main()
{
  struct entry *list;

  initEntry(list);    
  list->value = 5;
}

Я могу запустить программу после удаления последней инструкции (list->value = 5;)

Я компилирую с:

gcc main.c -o main

1 Ответ

0 голосов
/ 03 мая 2018

Вам нужно изменить его на:

void initEntry(struct entry **entry) {
  *entry = malloc(sizeof(struct entry));    
  (*entry)->value = 0;
}

int main() {
  struct entry *list;    
  initEntry(&list);    
  list->value = 5;
}

В вашем коде вы просто теряете адрес выделенной памяти после возврата из вызова initEntry(). Это потому, что аргумент entry является локальной переменной, относящейся к функции initEntry(), и присвоение ей любых значений невидимо извне. Вам нужен дополнительный уровень извлечения, чтобы иметь возможность вернуть адрес выделенной памяти.

...