Realloc постоянно терпит неудачу после того, как я добавляю 25 символов.
Ошибка:
Несоответствие, обнаруженное ld.so: dl-minimal.c: 116: realloc: Утверждение `ptr == alloc_last_block' не удалось!
char** linePtr = getLinePtr(block, y);
char* tmpPtr = realloc(*linePtr, (strlen(*linePtr) + 1) * sizeof(char));
if (tmpPtr != NULL) {
*linePtr = tmpPtr;
strinsert(tmpPtr, ch, x);
}
Я проверяю переменные прямо перед этим, и все кажется в порядке. *linePtr
указывает на строку из 24 символов, а strlen(*linePtr)
возвращает 24. Адрес, возвращаемый realloc
, всегда один и тот же.
Нет жестко запрограммированного числа, поэтому я понятия не имею, почему он всегда терпит неудачу после одного и того же количества символов.
*linePtr
было 1 всего одним байтом в начале, и сейчас я каждый раз перераспределяю один дополнительный байт.
Редактировать:
char** getLinePtr(Block* block, int y)
{
assert(y >= block->start && y <= block->start + block->nb_lines);
if (y == block->start + block->nb_lines) {
block->lines = realloc(block->lines, (block->nb_lines + 1) * sizeof(char*));
*(block->lines + block->nb_lines) = malloc(sizeof(char));
block->nb_lines++;
}
return block->lines + block->nb_lines - 1;
}
Редактировать2:
Вставляя код, я понимаю, что в getLinePtr есть ошибка: она возвращает последнюю строку вместо запрошенной (используя y), но это не должно ничего менять в этой ошибке. И используется только первая строка.
getLinePtr()
? Как он создает возвращаемое значение? - person hmjd   schedule 19.09.2012realloc
вblock->lines = realloc(block->lines, (block->nb_lines + 1) * sizeof(char*));
терпит неудачу, у вас возникает неприятная утечка памяти и неопределенное поведение при последующем использованииblock->lines
(прямо или косвенно). - person Daniel Fischer   schedule 19.09.2012strinsert(tmpPtr, ch, x);
? Сchar* tmpPtr = realloc(*linePtr, (strlen(*linePtr) + 1) * sizeof(char));
, если вы ранее не записывали за пределы выделенной области, вы не увеличиваете выделенную память, а либо сохраняете ее постоянной, либо уменьшаете ее, поскольку для строки требуетсяstrlen(s)+1
байта (один для 0-терминатора). - person Daniel Fischer   schedule 19.09.2012