簡體   English   中英

代碼在使用 Xcode 構建時運行,但僅在從 makefile 執行構建時出現分段錯誤

[英]Code runs when building it with Xcode but get segmentation fault only when executing build from makefile

我正在 C 中構建一個項目,該項目基本上包括使用 b+ 樹結構的簡化數據庫的實現。 我使用 Xcode 對主文件和 2 個本地庫進行編碼,當我通過 IDE 編譯代碼時,它運行完美。

但是,如果我使用我自己編寫的本地 Makefile 構建代碼,我會在代碼中的隨機 function 中遇到分段錯誤,甚至不應該使用 ZDBC11CAA5BDA99F77E6FB4DABD882E7D 來達到它。

這是我的 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

當我使用以下輸入 arguments 運行時: ./main.exe./my_answers/test_myanswer.txt./testes_toy/test.txt 4 3 (輸出文件名、輸入文件名、樹順序和要存儲的寄存器的大小樹),我得到一個分段錯誤。

我不知道這會有所幫助,但如果我評論 function ,它可以對子節點進行排序:

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 function 有關,但我不知道它在通過 Xcode 運行時是什么或為什么起作用。 也許我的 Makefile 可能缺少一些東西。

這個說法:

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]); 
            }
        }
    }
}  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM