gpt4 book ai didi

c - 初始化结构时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:36 25 4
gpt4 key购买 nike

我的目标是实现一种算法来检查图是否是拓扑图。但是,这不是这里的问题。尝试使用给定数据初始化图形结构时出现核心转储。

Program received signal SIGSEGV, Segmentation fault.
0x00000000004009a3 in initGraph (numberNode=15, numberArc=17, g=0x1) at src/topologicGraphOp.c:45
45 g->numberNode = numberNode;

我真的很困惑,因为这个问题看起来很明显,但经过各种尝试后我还是找不到它,所以我希望有人会发现像“呸,这很明显”这样的愚蠢错误,因为好吧......我'我运气不好...

结构如下:

typedef struct {
int numberNode;
int numberArc;

int *distances;
int *predecessors;

float **matrix;
queue *successors;

char *graphTitle;
char **nodeDescription;
int *time;

} graph;

以及核心转储似乎出现的函数:

void initGraph(int numberNode, int numberArc, graph *g) {
int i, j;

g->numberNode = numberNode;
g->numberArc = numberArc;
g->nodeDescription = malloc(numberNode * sizeof (char));
g->matrix = (float **) calloc(g->numberNode, sizeof (float*));

for (i = 0; i < g->numberNode; i++) {
g->matrix[i] = (float *) calloc(g->numberNode, sizeof (float));
g->nodeDescription[i] = malloc(sizeof (char));
}
}

我的主函数只是调用初始化函数。非常感谢!

编辑:评论中的解决方案:)在函数中使用它之前,我忘记 malloc 我的图形指针。

最佳答案

main() 调用必须是这样的:

graph g;
initGraph(1, 1, &g);

或者像这样:

graph *g = malloc( sizeof(graph) );
initGraph(1, 1, g);

编辑:

在评论中有一个多选问题,关于我如何解释代码中存在未在 OP 查询中显示的错误。

让我们看看函数的开始:

void initGraph(int numberNode, int numberArc, graph *g) {
int i, j;
g->numberNode = numberNode;
}

错误:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004009a3 in initGraph (numberNode=15, numberArc=17, g=0x1) at src/topologicGraphOp.c:45
45 g->numberNode = numberNode;

错误提到第 45 行,我在评论中被问到关于我们如何知道第 45 行在哪里的问题。但是,我立即删除了问题,因为在行号错误附近显示了行内容,因此我们可以在提到的代码中找到该行。

45 行的代码非常简单,只有当指针 g 指向错误的内存时才可能导致错误。

指针g 在使用前未被该函数修改。此函数假定函数参数 g 指向的有效内存。

因此,调用函数时使用了参数 g 的错误指针。所以我只是建议使用有效且典型的方法来正确初始化变量并使用此类参数调用此类函数。

关于c - 初始化结构时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44347718/

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