Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 59
1

Segmentation fault при вызове malloc

29.09.2010, 18:26. Показов 4648. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Щас создавал модуль на Си для работы со списком, думал минутное дело, за 40 мин накатал и уже почти час не могу понять почему выдает Segmentation fault при вызове malloc в функции Create, объясните пожалуйста, вот фрагменты кода:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef int T;
 
struct Item {
    struct Item* prev;
    struct Item* next;
    T data;
};
 
typedef struct {
    struct Item* node;
} Iterator;
 
typedef struct {
    struct Item* head;
    int size;
} List;
 
void Create (List* l) {
    printf ("111\n");
    l->head = malloc (sizeof (struct Item)); /* ИМЕННО ЗДЕСЬ ВЫЛЕТАЕТ С Segmentation fault */
    printf ("--\n");
    l->head->next = l->head->prev = l->head;
    l->size=0;
}

Не забываю говорить спасибо)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2010, 18:26
Ответы с готовыми решениями:

Segmentation fault при выполнении сортировки qsort
Пишу для изучения си программку, типа базы данных. Данные хранятся в массиве структур, и когда я...

Segmentation fault при создании своего стека
Написал свою версию стека с помощью двусвязного списка.Все компилируется нормально, но при запуске...

Segmentation fault при попытке чтения файла (которого нет)
Новичок в С. Сижу под линухом. Что-бы освоить аргументы командной строки и i/o файлов в С решил...

Segmentation Fault при выделении памяти под четырех мерный массив
Нужно выделить память под четырехмерный массив 2x6x5x6,выдает сегментейшн фолт,в чем может быть...

10
Evg
Эксперт CАвтор FAQ
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.09.2010, 18:33 2
Проблема, скорее всего не в вызове malloc'а, а в записи в l->head. Наверняка в качестве l подаётся кривой указатель.

Ну и ещё один совет на будщее: вместо printf("lll\n"); используй fprintf (stderr,"lll\n"); потому как печать в stderr НЕ буфферизуется, а потому она заведомо напечатается на экране. В то время как печать через printf может сохраниться во внутреннем буфере, а при аварийном завершении на экран уже не напечатается. Т.е. если вданном тесте увидел печать "lll", но не увидел печать "---", это езё не значит, что до второго printf'а ты не дошёл. Теоретически проблема может быть в 22 или 23 строке, но печать ты не увидел, потому что текст залип в буффере
2
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 59
29.09.2010, 18:36  [ТС] 3
o_0 Большое спасибо, до этого как-то не знал о существовании такой проблемы. Хотя все равно надо бы отладчиком пользоваться по хорошему)
Но все-таки, в 22 или 23 строк ведь не можеть быть проблемы,там вроде все правильно.
0
Evg
Эксперт CАвтор FAQ
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.09.2010, 18:40 4
Цитата Сообщение от trueherofromad Посмотреть сообщение
Хотя все равно надо бы отладчиком пользоваться по хорошему)
Нужно уметь пользоваться отладчиком и нужно уметь отлаживаться printf'ами. Одно другому не мешает

Цитата Сообщение от trueherofromad Посмотреть сообщение
Но все-таки, в 22 или 23 строк ведь не можеть быть проблемы,там вроде все правильно.
Конкретно в этом случае проблема может быть в том, что malloc вернул NULL, а потом ты по этому NULL'у что-то пытаешься записать. Понятное дело, что это не твой случай (ибо памяти просят совсем чуть-чуть). Но в общем случае при отладке через printf надо иметь в виду момент с буфферизацией
0
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
29.09.2010, 18:49 5
C
1
l->head = (Item*)malloc (sizeof (struct Item));
Не так ли надо?
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 59
29.09.2010, 18:52  [ТС] 6
Да, я понял, эта информация в любом случае крайне полезна.
И ЕЩЕ! Я щас проверил одну вещь и сделал так в функции,которая юзала модуль:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
List list;
Iterator iter;
 
printf ("begin\n");
Create (&list);
printf ("create\n");
 
раньше было так:
 
List* list;
Iterator* iter;
 
 
printf ("begin\n");
Create (list);
printf ("create\n");
И почему-то после этого функция create нормально отработала. Теперь я уж совсем запутался, не подскажите в чем тут проблема?
0
Evg
Эксперт CАвтор FAQ
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.09.2010, 20:30 7
Цитата Сообщение от besstiaa Посмотреть сообщение
Не так ли надо?
В худшем случае без этого будет ошибка компиляции, потому что некоторые компиляторы запрещают присваивать указатели без преобразования. Но как правило это всего лишь предупреждение. На работоспособность кода это не влияет

Цитата Сообщение от trueherofromad Посмотреть сообщение
Теперь я уж совсем запутался, не подскажите в чем тут проблема?
Читай в книге, что такое указатель. В первом случае у тебя была переменная и ты подавал её указатель, а во втором случае был указатель, который указывал никуда
1
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 59
30.09.2010, 02:03  [ТС] 8
Ну так он и должен указывать никуда, список ведь пустой и функция create его только создает...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.09.2010, 02:16 9
trueherofromad, Для этого вроде как есть

List list=NULL;//Си
List list=0; //C++

Но могу быть не прав.
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
30.09.2010, 03:04 10
Цитата Сообщение от trueherofromad Посмотреть сообщение
Да, я понял, эта информация в любом случае крайне полезна.
И ЕЩЕ! Я щас проверил одну вещь и сделал так в функции,которая юзала модуль:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
List list;
Iterator iter;
 
printf ("begin\n");
Create (&list);
printf ("create\n");
 
раньше было так:
 
List* list;
Iterator* iter;
 
 
printf ("begin\n");
Create (list);
printf ("create\n");
И почему-то после этого функция create нормально отработала. Теперь я уж совсем запутался, не подскажите в чем тут проблема?
Подумай,ты объявляешь указатель List *x ,а потом (ДО ВЫЗОВА malloc!( если я правильно понимаю порядок выполнения операций)) пытаешься инициализировать поле внутри структуры. Ты не выделил память для структуры,поэтому при обращении к любому полю происходит Segmentation fault,потому что непонятно,куда указывает указатель на List,ка уже сказал Evg
1
Evg
Эксперт CАвтор FAQ
21280 / 8304 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.09.2010, 09:13 11
Цитата Сообщение от trueherofromad Посмотреть сообщение
Ну так он и должен указывать никуда, список ведь пустой и функция create его только создает...
Create создаёт другой указатель и записывает его в поле структуры, на которое смотрит первый указатель. А первый указатель, поскольку он не инициализирован, смотрит, грубо говоря, хрен знает куда. А вот если написать

C
1
List* list = malloc (sizeof (List));
То всё срастётся. Так или иначе каждый программист на начальном этапе развития сталкивается с непонятками в этом месте. История показывает, что человеку можно объяснять очень долго, но нормальное ощущение происходящего приходит только с практикой
1
30.09.2010, 09:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2010, 09:13
Помогаю со студенческими работами здесь

Segmentation fault (core dumped): ошибка при любом вводе после компиляции
Всем доброго времени суток. Не могли бы посмотреть программу и подсказать ошибку. При компиляции...

Вылетает ошибка при вызове malloc
Есть такой код: FILE *file; struct Student *students = 0; struct Student student; struct...

При попытке использовать одновременно параметры-nostartfiles и-static программа выдаёт Segmentation fault
#define MESG "Hello, World!\n" #define MESG_SZ sizeof(MESG) main() { write(1,MESG,MESG_SZ);...

Segmentation fault
а) qsort(v, left, last-1, comp); б) qsort(v, left, last--, comp); Ребята чем отличается функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru