0

以下是实现图形的 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;
}
4

1 回答 1

0

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

These lines don't look right. Perhaps one of the expressions was supposed to be g->e?

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

此外,正如 BSH 在已删除的答案中指出的那样,sizeof((g->v)*(g->v))在大多数当前机器上将评估为 4。你想要:malloc(g->v * g->e * sizeof(int))。而你想adj成为int*,不是int**

使用valgrindaddress sanitizer来修复此类错误。

于 2013-10-27T18:54:12.267 回答