代码在使用Xcode构建时运行,但仅当从makefile执行构建时才会出现分段错误

问题描述 投票:0回答:1

我正在用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可能缺少某些内容。

c xcode makefile segmentation-fault
1个回答
1
投票

此语句:

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++ ) {

OPs代码中还有其他一些问题。

这里是适当的冒泡排序算法

void bubbleSort(int arr[], int n) 
{ 
    int i, j; 
    for (i = 0; i < n-1; i++) 
    {      

        // Last i elements are already in place    
        for (j = 0; j < n-i-1; j++)
        {  
            if (arr[j] > arr[j+1]) 
            {
                swap(&arr[j], &arr[j+1]); 
            }
        }
    }
}  
© www.soinside.com 2019 - 2024. All rights reserved.