Я строю проект в C, который в основном состоит из реализации упрощенной базы данных с использованием структуры дерева b +. Я использовал Xcode для кодирования основного файла, а также 2 локальных библиотек, и когда я компилирую код через IDE, он отлично работает.
Однако, если я строю код, используя локальный Makefile, который я написал сам, я получаю ошибка сегментации в случайной функции в коде и то, что она даже не должна быть достигнута с аргументами, которые я дал в качестве ввода.
Вот мой Makefile
CC = gcc
CFLAGS = -g -O0
all: main.exe
main.exe: main.o b_tree.o queue.o
$(CC) $(CFLAGS) main.o b_tree.o queue.o -o main.exe
main.o: main.c b_tree.h queue.h
$(CC) $(CFLAGS) -c main.c
b_tree.o: b_tree.h b_tree.c
$(CC) $(CFLAGS) -c b_tree.c
queue.o: queue.h queue.c
$(CC) $(CFLAGS) -c queue.c
clean:
rm *.o main.exe
Когда я запускаю используя следующие входные аргументы: ./main.exe ./my_answers/test_myanswer.txt ./testes_toy/test.txt 4 3
(имя выходного файла, имя входного файла, порядок дерева и размер регистра, который будет храниться в дереве), я получаю ошибку сегментации.
Я не знаю это помогло бы, но если я прокомментирую функцию, которая сортирует дочерние узлы, она работает:
void sortNodesChildren(Node *node){
if (node->numChildren == 0) {
return;
}
// Get all children nodes
Node *childrenNodes = realloc(NULL, sizeof(node)*node->numChildren);
for (int k = 0; k < node->numChildren; ++k) {
Node n = getNode(node->childNodes[k]);
childrenNodes[k] = n;
}
// Sort children nodes
for(int i = 0;i<node->numChildren;i++){
for (int j = i+1; j<node->numChildren; j++) {
Node aux; long auxId;
if (childrenNodes[i].registerKeys[0] > childrenNodes[j].registerKeys[0]) {
aux = childrenNodes[i];
auxId = node->childNodes[i];
childrenNodes[i] = childrenNodes[j];
node->childNodes[i] = node->childNodes[j];
childrenNodes[j] = aux;
node->childNodes[j] = auxId;
}
}
}
free(childrenNodes);
}
Мне кажется, что это может быть связано с функцией realloc
, но я понятия не имею, что или почему это работает при запуске через Xcode. Может быть, мой Makefile может что-то упустить.