У меня есть ошибка Segmentation fault (core dumped)
.Malloc не может выделить память для архитектуры
main.c
#include "header1.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
struct t_list *list = NULL;
doFill(list);
printf("%s\n", list->name);
free(list);
return 0;
}
header1.h
#ifndef HEADER1_H
#define HEADER1_H
struct t_list {
char *name;
struct t_list *next;
};
void doFill(struct t_list *list);
#endif
worker.c
#include "header1.h"
#include <stdlib.h>
void doFill(struct t_list *list) {
list = (struct t_list *) malloc(sizeof(struct t_list));
char *tmp = "somename";
list->name = tmp;
list->next = NULL;
}
Когда я запускаю это (gcc -g main.c worker.c -o test
) я получаю (на линии с printf
в main.c):
Segmentation fault (core dumped)
В gdb
я вижу:
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffddf8) at main.c:8
8 struct t_list *list = NULL;
(gdb) next
9 doFill(list);
(gdb) step
doFill (list=0x0) at worker.c:6
6 list = (struct t_list *) malloc(sizeof(struct t_list));
(gdb) p list
$1 = (struct t_list *) 0x0
(gdb) next
7 char *tmp = "somename";
(gdb) p list
$2 = (struct t_list *) 0x0
Как вы можете видеть malloc
в worker.c не выделяет память для переменная list
(указатель до и после malloc
указывает на 0x0
).
Если переместить код из doFill
процедуры в main.c она работает правильно:
main.c
#include "header1.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
struct t_list *list;
list = (struct t_list *) malloc(sizeof(struct t_list));
char *tmp = "somename";
list->name = tmp;
list->next = NULL;
printf("%s\n", list->name);
free(list);
return 0;
}
$ gcc -g main.c -o test
$ ./test
somename
Как это возможно? Что я делаю неправильно?
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
'недействительным doFill (STRUCT t_list * list) 'Вам нужно' ** 'здесь, чтобы сделать выделение видимым вызывающим. –
[Не произносить результат malloc (и друзей)] (http://stackoverflow.com/q/605845). – Deduplicator
@Deduplicator Спасибо за ссылку, я прочитал книгу «Язык программирования C», написанную создателями языка c.Они выдали результаты malloc, я тоже бросаю. Но книга была написана в 1988 году, и я согласен с тем, что это могло быть устаревшим поведением. – zaratustra