Ситуация: есть указатель, непроинициализированный ещё. Допустим, *ptr.
Вызываем функцию, которая выделяет память при помощи библиотечной malloc (пробовал и g_malloc тоже). Функция внутри себя проверяет, что память выделилась успешно, заполняет поля некой структуры, и выходит - возвращая нуль (а в случае ошибки возвращает -1).
В main проверяем состояние указателя до и после вызова это функции - в обоих случаях (!) он равен NULL, то есть malloc словно бы не сработал. При этом, ессно, любое обращение к полям вышеозначенной структуры даёт в лучшем случае segmentation fault.
Что за херота? Почему всегда оно работало, а щас вдруг перестало?
Вот фрагмент кода main.c:
bcircular_t *Fifo; printf ("Before: %p\n", Fifo); result = bcircular_init (Fifo, 1024); printf ("(%d) After: %p\n", result, Fifo);
Фрагмент кода circular.c (всегда работавший и неоднократно применявшийся ранее):
.... int bcircular_init (bcircular_t *c, uint16_t depth) { bcircular_verbose (c, "init "); c = (bcircular_t *)g_malloc0(sizeof(bcircular_t)); if (c == NULL) { bcircular_verbose (c, "failed - can't alloc structures\n"); return -1; /* fail */ } else { ..... return 0; } }
Add А вот ИСПРАВЛЕННЫЙ фрагмент (поскрипана несущественная в данном случае часть кода):
int bcircular_init (bcircular_t **pc, uint16_t depth) { bcircular_t *c; c = (bcircular_t *)g_malloc0(sizeof(bcircular_t)); bcircular_verbose (c, "init "); if (c == NULL) { bcircular_verbose (c, "failed - can't alloc structures\n"); return -1; /* fail */ } else { bcircular_verbose (c, "ok\n"); return 0; } }
Всё, работает. Без лишних вопросов стреляет в ногу.