Код выполняется при сборке с помощью Xcode, но ошибка сегментации возникает только при выполнении сборки из make-файла - PullRequest
0 голосов
/ 23 апреля 2020

Я строю проект в 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 может что-то упустить.

1 Ответ

1 голос
/ 23 апреля 2020

это утверждение:

for(int i = 0;i<node->numChildren;i++){

должно останавливаться на 1 раньше, в противном случае:

for (int j = i+1; j<node->numChildren; j++) {

будет иметь доступ за концом массива

Предложить:

for( int i = 0; i < (node->numChildren - 1); i++ ){
    for ( int j = i+1; j<node->numChildren; j++ ) {

Однако в коде OP есть и другие проблемы.

Вот правильный алгоритм сортировки пузырьков

void bubbleSort(int arr[], int n) 
{  
    for ( int i = 0; i < n-1; i++) 
    {      
        // Last i elements are already in place    
        for ( int j = 0; j < n-i-1; j++)
        {  
            if (arr[j] > arr[j+1]) 
            {
                swap(&arr[j], &arr[j+1]); 
            }
        }
    }
}  
...