Я получаю сигнал SIGTRAP при попытке освободить динамически созданный массив и понятия не имею, почему.
Я выделяю массив следующим образом:
int* visited = (int*) malloc( l.nodeCount * sizeof(int));
(l.nodeCount — целое число. В экземпляре программы, в котором я получаю эту ошибку, для него установлено значение 12.)
И когда я пытаюсь free(visited)
, я получаю сигнал SIGTRAP в отладчике.
Вся функция такова:
int Graph_GetSmallestPathCount(AdjacencyList l, int destination){
//One path if destination is root
if(destination == 0) return 1;
if(l.nodeCount == 0)
return 0;
Queue reading = Queue_NewQueue();
Queue storing = Queue_NewQueue();
/*Allocates visited array*/
int* visited = (int*) calloc( l.nodeCount, sizeof(int));
/*Visited array initialization*/
int i;
for(i = 0; i < l.nodeCount; i++)
visited[i] = 0;
/*Marks root node and enqueues it*/
visited[0] = 1;
Queue_Enqueue(&reading, 0);
//While there are nodes to read
while(!Queue_IsEmpty(reading))
{
//Dequeues a node
int v = Queue_Dequeue(&reading);
//Gets it's adjacency list
List* currentList = AdjacencyList_GetAdjacentNodes(l, v);
listCell* auxCell = currentList->head->next;
//While there are nodes in it's adjacency list
while(auxCell != NULL){
//Enqueues it if it has not been visited
if(visited[auxCell->data] == 0){
Queue_Enqueue(&storing, auxCell->data);
}
//Adds to the paths to that node
visited[auxCell->data] += visited[v];
auxCell = auxCell->next;
}
//When the queue ends
if(Queue_IsEmpty(reading)){
//If the destination has been reached, return
if(visited[destination] > 0){
Queue_Destroy(&reading);
Queue_Destroy(&storing);
return visited[destination];
}
else{
//Switch queues
Queue_Destroy(&reading);
reading = storing;
storing = Queue_NewQueue();
}
}
}
//Destination has not been reached before end of algorithms. Deallocate everything and return 0
free(visited);
Queue_Destroy(&reading);
Queue_Destroy(&storing);
return 0;
}
Извините за отсутствие комментариев, я сделал это на бегу и ничего не добавил. Также извините за перегрузку printf, я поместил их туда, пытаясь точно определить проблему. РЕДАКТИРОВАТЬ: я немного почистил его.
Странно то, что программа работает для одних входных данных и не работает для других.
Надеюсь, кто-нибудь сможет мне помочь =D
free()
может вызвать эту ошибку. - person Yetti99   schedule 26.10.2014auxCell->data
вvisited[auxCell->data] += visited[v];
быть равным или больше, чемl.nodeCount
? - person 404   schedule 26.10.2014