LINUX.ORG.RU

hello word на С и SIGSEGV

 


0

1

Доброго времени суток. хочу для себя написать велосипед на С. У меня загвоздка в том что при создании списка когда выделяется память программа выпадает в SIGSEGV. Каких то ошибок в коде я не вижу, но разобраться в этой проблеме с gdb не могу. подскажите где можно найти решение этой проблемы. source

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7ab8e69 in ?? () from /lib64/libc.so.6
=> 0x00007ffff7ab8e69:	4c 89 63 10	mov    QWORD PTR [rbx+0x10],r12
(gdb) bt
#0  0x00007ffff7ab8e69 in ?? () from /lib64/libc.so.6
#1  0x00007ffff7aba9c8 in malloc () from /lib64/libc.so.6
#2  0x0000000000400c56 in Xmalloc (size=72) at keyboard_trainer.c:52
#3  0x00000000004010c0 in create_cache (name_file=0x60b273 "English мини марафон") at keyboard_trainer.c:154
#4  0x00000000004012d4 in build_cache () at keyboard_trainer.c:183
#5  0x0000000000401351 in cache () at keyboard_trainer.c:197
#6  0x00000000004013a4 in main () at keyboard_trainer.c:208

У тебя ошибка в get_size_index, build_shift_index и в выделении памяти для shift_index (где * sizeof(size_t) ?).

anonymous
()
Ответ на: комментарий от SmilePlz

Чтобы больше так не ошибаться, объяви и используй для выделений памяти:

#define NEW(T, n) ((T*)smalloc(n, sizeof(T)))

Каст к T* нужен, чтобы компилятор отказывался компилировать, например, char *p = NEW(int, 20);.

В smalloc хорошо бы проверять, что умножение первого аргумента на второй не переполняет size_t.

А ещё по стандарту NULL может «представлять» выделенный участок памяти размером ноль, так что перед тем, как делать exit(FAILURE_MEMORY); нужно проверять, что size ≠ 0.

doushiyou
()
Ответ на: комментарий от anonymous

да действительно, хотя я исправил shift_index, но у меня стала ошибка SIGABRT после того как переписал еще и get_size_index, build_shift_index чтобы точно не выходило за границу с дополнительной проверкой, все заработало. обидно что до меня не доходит где именно там была ошибка, спасибо большое.

SmilePlz
() автор топика
Ответ на: комментарий от SmilePlz

обидно что до меня не доходит где именно там была ошибка

В get_size_index размер индекса на единицу меньше чем после ты заполняешь в build_shift_index.
Т.е. смотри если в файле один перевод строки, размер индекса ты возвращаешь 1, но в build_shift_index ты делаешь size_t count = 0; shift_index[count] = 0;, и после перевода строки ты записываешь второй индекс в массив размер которого таки единица, и получаешь...
И ещё, в файле последняя строка может быть без перевода строки.

В build_shift_index, в строке shift_index[++count] = ++i; может возникнуть ситуация когда ты выйдешь за пределы массива, по мне лучше переписать в виде shift_index[++count] = i + 1;

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.