Другие языки программирования и технологии

Непонятная ошибка в программе на Си (в функции malloc)

система выдает: malloc.c:3074: sYSMALLOc: Assertion (old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0) failed. Происходит это в одной из функций программы прямо на перых строке block *a=malloc(sizeof(block)); стркутура выглдит так typedef struct block{ struct block *left; struct element *node; int size; bool list; } block; при этом функция вызывается несколько раз, а падает только на третий раз...
Скорее всего у тебя ошибка в логике программы а не в работе malloc().Если ф-ция пару раз вызывается нормально, а только потом падает. Нужно смотреть весь код. Хотябы код самой ф-ции и тот код, где она и как вызывается. Плюс убери в конце описания структуры создание объекта block.Ты его не создаёшь, его создаёт код, следовательно ты не можешь им управлять. Возможно ты где-то его используешь, потом удаляешь, потом для создания нового объекта используешь уже NULL(хотя думаешь, что объект block существует). А когда пытаешься обратиться к созданному через NULL объекту, то тебя выкидывает. В-общем при работе с памятью ошибки могут быть самые непредсказуемые. И найти их очень не просто. Они не лежат на поверхности. По-этому некоторые платформы возложили работу с памятью на себя, не разрешая программистам вмешиваться в это дело. Например, JAVA и .NET.Хорошо что ошибка выскочила на третьем вызове. А еслиб она выскочила на двух-миллионном. Ты уже давно прогнал программу, её давно установили на бортовой комп самолёта, а она вылезла чёрт знает когда.
Маирбек Сотиев
Маирбек Сотиев
9 759
Лучший ответ
дело не в malloc
malloc выделяет память размером sizeof
но у тебя в структуре содержится указатели... .
для них память не выделяется.. . а точее выделяется только для адреса ...для Win32 это 32 бита... .

ты скорей всего пытаешься использовать указатель внутри структуры для которого память не выделена....
Саша Саш
Саша Саш
10 484
Александр Никонов Насчет использование не выделенных указателей
1) Подобного в программе не происходит
2) Еслиб и происходило, то тогда отладчик вылетал бы на строчке где идет вызов по несуществующему адресу, а не на строчке с функцией malloc
3) В такой ситуации была бы просто ошибка сигментирования, а не такая фигня =)
Разве malloc возвращает не void? А где преобразование типов:

block *a= (block*) malloc(sizeof(block));

Если ничего не путаю компилер должен был ругнуться.
Маирбек Сотиев C-компиляторы на это не ругаются.Это ошибка в С++.А в С происходило автоматическое преобразования void* к типу левого операнда.