Двойная ошибка realloc...?
У меня есть функция, которая используется для расширения массива (графика) и добавления нового значения в конце. Первый запрос к функции проходит нормально, но что-то идет не так, когда я делаю это во второй раз...
Код:
struct station *addStation(struct station *graph, struct station newStation, size_t *stationCount){
size_t newCount = *stationCount+1;
graph = realloc(graph, newCount*sizeof(struct station));
*stationCount = newCount;
graph[*stationCount] = newStation;
return graph;
}
и запрос:
Station *graph;
graph = malloc(146*sizeof(Station));
graph = loadStations(graph, &stationCount);
Station newStation = graph[0]; // Dummyvalue
printf("StationCount:%d\n",stationCount);
graph = addStation(graph, newStation, &stationCount);
printf("StationCount:%d\n",stationCount);
graph = addStation(graph, newStation, &stationCount);
Из-за второй строки graph = addStation... я получаю некоторую ошибку вывода памяти в терминале:
StationCount: 146 StationCount: 147 reseplanerare: malloc.c: 2369: sysmalloc: Утверждение `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) *) 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__buildin_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)'не удалось. Прервано (SIGABRT) (печать из памяти создана)
Я не понимаю, почему это происходит...
1 ответ
С-массивы начинаются с нуля, так graph
имеет действительные индексы [0..newCount-1]
graph[*stationCount] = newStation;
пишет за пределами вашей выделенной памяти. Это приводит к неопределенному поведению. Я предполагаю, что в вашем случае это повреждение защитного слова, используемого менеджером кучи для обнаружения именно такого рода повреждения памяти.
Вы можете исправить это, изменив индекс массива, в который вы пишете:
graph[newCount-1] = newStation;