gpt4 book ai didi

c - C 程序中的段错误追溯到 malloc 调用,无法弄清楚原因

转载 作者:行者123 更新时间:2023-11-30 15:23:36 25 4
gpt4 key购买 nike

我正在编写一个程序,该程序生成一个无向图并对该图执行 BFS。该图使用邻接列表表示,它构建在我之前构建的 List 结构之上。无论如何,我尝试从文件加载图形,然后对其执行 BFS,但是如果我对具有超过 30 个顶点的图形(从文件加载)执行 BFS,我会在 malloc 调用期间遇到段错误。然而,如果我不从文件加载图形,而是手动制作它(使用循环并手动添加顶点/边),我可以拥有数千个顶点和 10k+ 边,并且根本不会发生段错误。这显然让我认为我在加载图形数据时所做的事情正在破坏堆,但奇怪的是失败的 malloc 调用不在从文件读取的函数中,而该函数确实正确地将输入文件转换为图形数据结构,所以我迷失了。下面是从输入文件读取的函数。

以下是我在 GDB 上的输出:

Program received signal SIGSEGV, Segmentation fault.
_int_malloc (av=0x7ffff7dd3760 <main_arena>, bytes=24) at malloc.c:3766
3766 malloc.c: No such file or directory.

我想强调的是,这个函数内部一定有某些东西导致我的堆损坏,即使损坏直到稍后才显示出来。

Graph readFile(char * fn) {

FILE * fp = fopen(fn, "r");
char line[80];

if(fp == NULL) {
fprintf(stderr, "Error : Invalid Filename Argument");
exit(1);
}

fgets(line, 80, fp);
int order = 0;
sscanf(line, "%d", &order);
if(order <= 0) {
fprintf(stderr, "Error parsing input file, order < 0");
exit(1);
}
printf("%d\n", order);
Graph new_graph = newGraph(order);

while(fgets(line, 80, fp) != NULL)
{
int origin = -1;
int terminus = -1;
sscanf(line, "%d %d", &origin, &terminus);
printf("%d %d\n", origin, terminus);
if(origin > 0 && terminus > 0 && origin <= order && terminus <= order) {
addEdge(new_graph, origin , terminus);
}
else {
break;
}
}
fclose(fp);
//printGraph(stdout, new_graph);
return new_graph;
}

如果我调用此函数来加载图形,然后执行 BFS,则 List 类内的函数中的以下 malloc 调用会失败

void append(List L, int data) {
if(L == NULL) {
fprintf(stderr, "Error : L null in append\n");
exit(1);
}

printf("Before\n");
Node * new_node = malloc(sizeof(Node)); <-- SEGFAULTS
printf("After\n");
if(new_node == NULL) {
fprintf(stderr, "Error : Malloc Fail in Append");
}
new_node->data = data;

// printf("Midway\n");
if(L->num_nodes == 0) {
L->front_node = new_node;
L->back_node = new_node;
L->num_nodes++;
return;
}
new_node->prev = L->back_node;
L->back_node->next = new_node;
L->back_node = new_node;
L->num_nodes++;
}

最佳答案

所以我以某种方式修复了它..事实证明与我的 readFile 函数无关,由于某种原因,它只是带来了错误,即使与我正在测试的数千个顶点相比,我只读取了几个顶点之前。为了解决这个问题,我简单地改变了每一个

Node * new_node = malloc(sizeof(Node))

调用以下内容

Node * new_node = newNode();

并实现了以下功能

Node * newNode(void) {
Node * new_node = malloc(sizeof(struct NodeObj));
if(new_node == NULL) {
fprintf(stderr, "Error : Malloc returned null node");
exit(1);
}
new_node->prev = NULL;
new_node->next = NULL;
new_node->data = -1;
return new_node;
}

希望对将来的人有所帮助,我仍然不知道为什么我的堆被损坏,但现在似乎工作得更好了。

关于c - C 程序中的段错误追溯到 malloc 调用,无法弄清楚原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28736888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com