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



我正在用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可能缺少什么。

此语句:

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

相关内容

  • 没有找到相关文章

最新更新