gpt4 book ai didi

c - 为什么在执行此 c 代码片段期间会转储分段核心

转载 作者:行者123 更新时间:2023-11-30 17:45:28 24 4
gpt4 key购买 nike

以下是实现的C代码:该代码在执行后抛出段错误。我尝试使用gdb调试程序并设置断点在第一次 malloc 操作之前。malloc 操作之前缓冲区的值为 0x00.....我该如何克服这个问题以及为什么会发生这种情况?

#include<stdio.h>
#include<malloc.h>
typedef struct graph
{
int v;
int e;
int **adj;
}graph;

int main()
{

int i,u,v;
graph *g=(graph*)malloc(sizeof(graph)); // first malloc call
scanf(" %d %d",&(g->v),&(g->v));

g->adj=malloc(sizeof((g->v)*(g->v)));


for(u=0;u<(g->v);u++)
{
for(v=0;v<(g->v);v++)
g->adj[u][v]=0;
}
printf(" Enter input");

for(i=0;i<(g->e);i++){
scanf("%d %d",&u,&v);
g->adj[u][v]=1;
g->adj[v][u]=1;

}
printf("print matriix ");

for(u = 0; u<(g->v); u++) {

for(v = 0; v<(g->v) ; u++)
printf("%d",(g->adj[u][v]));
printf("\n");
}


return 0;
}

最佳答案

scanf(" %d %d",&(g->v),&(g->v));
g->adj=malloc(sizeof((g->v)*(g->v)));

这些线条看起来不对。也许其中一个表达式应该是 g->e

无论如何,对于所写的代码来说,无法预测g->v是第一个还是第二个扫描到的数字。 g->e 未初始化,但您可以在稍后的循环中使用它。

此外,正如 BSH 在删除的答案中指出的那样,sizeof((g->v)*(g->v)) 在大多数当前机器上的计算结果为 4。您需要:malloc(g->v * g->e * sizeof(int))。并且您希望 adjint*,而不是 int**

使用valgrindaddress sanitizer找到修复这样的错误。

关于c - 为什么在执行此 c 代码片段期间会转储分段核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19621593/

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