1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 59
|
||||||
1 | ||||||
Segmentation fault при вызове malloc29.09.2010, 18:26. Показов 4648. Ответов 10
Метки нет (Все метки)
Щас создавал модуль на Си для работы со списком, думал минутное дело, за 40 мин накатал и уже почти час не могу понять почему выдает Segmentation fault при вызове malloc в функции Create, объясните пожалуйста, вот фрагменты кода:
Не забываю говорить спасибо)
0
|
29.09.2010, 18:26 | |
Ответы с готовыми решениями:
10
Segmentation fault при выполнении сортировки qsort Segmentation fault при создании своего стека Segmentation fault при попытке чтения файла (которого нет) Segmentation Fault при выделении памяти под четырех мерный массив |
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
|
29.09.2010, 18:40 | 4 |
Нужно уметь пользоваться отладчиком и нужно уметь отлаживаться printf'ами. Одно другому не мешает
Конкретно в этом случае проблема может быть в том, что malloc вернул NULL, а потом ты по этому NULL'у что-то пытаешься записать. Понятное дело, что это не твой случай (ибо памяти просят совсем чуть-чуть). Но в общем случае при отладке через printf надо иметь в виду момент с буфферизацией
0
|
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
|
||||||
29.09.2010, 18:49 | 5 | |||||
0
|
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 59
|
||||||
29.09.2010, 18:52 [ТС] | 6 | |||||
Да, я понял, эта информация в любом случае крайне полезна.
И ЕЩЕ! Я щас проверил одну вещь и сделал так в функции,которая юзала модуль:
0
|
29.09.2010, 20:30 | 7 |
В худшем случае без этого будет ошибка компиляции, потому что некоторые компиляторы запрещают присваивать указатели без преобразования. Но как правило это всего лишь предупреждение. На работоспособность кода это не влияет
Читай в книге, что такое указатель. В первом случае у тебя была переменная и ты подавал её указатель, а во втором случае был указатель, который указывал никуда
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 |
Подумай,ты объявляешь указатель List *x ,а потом (ДО ВЫЗОВА malloc!( если я правильно понимаю порядок выполнения операций)) пытаешься инициализировать поле внутри структуры. Ты не выделил память для структуры,поэтому при обращении к любому полю происходит Segmentation fault,потому что непонятно,куда указывает указатель на List,ка уже сказал Evg
1
|
30.09.2010, 09:13 | 11 | |||||
Create создаёт другой указатель и записывает его в поле структуры, на которое смотрит первый указатель. А первый указатель, поскольку он не инициализирован, смотрит, грубо говоря, хрен знает куда. А вот если написать
1
|
30.09.2010, 09:13 | |
30.09.2010, 09:13 | |
Помогаю со студенческими работами здесь
11
Segmentation fault (core dumped): ошибка при любом вводе после компиляции Вылетает ошибка при вызове malloc При попытке использовать одновременно параметры-nostartfiles и-static программа выдаёт Segmentation fault Segmentation fault Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |