c - Malloc cannot allocate memory for a structure -
i have segmentation fault (core dumped) error.
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); homecoming 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; } when run (gcc -g main.c worker.c -o test) (on line printf in main.c):
segmentation fault (core dumped) in gdb see:
temporary breakpoint 1, main (argc=1, argv=0x7fffffffddf8) @ main.c:8 8 struct t_list *list = null; (gdb) next 9 dofill(list); (gdb) step dofill (list=0x0) @ 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 as can see malloc in worker.c doesn't allocate memory list variable (the pointer before , after malloc points @ 0x0).
if move code dofill procedure in main.c works correctly:
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); homecoming 0; } $ gcc -g main.c -o test $ ./test somename how possible? do wrong?
gcc version 4.8.2 (ubuntu 4.8.2-19ubuntu1)
parameters in c passed copy. changes create list within of dofill() not propagated main(), means list null in main(). seek passing pointer pointer instead:
#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); homecoming 0; } and alter dofill() accordingly:
#include "header1.h" #include <stdlib.h> void dofill(struct t_list **list) { *list = malloc(sizeof(**list)); char *tmp = "somename"; (*list)->name = tmp; (*list)->next = null; } c gcc struct segmentation-fault malloc
No comments:
Post a Comment