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

これらの行は正しくありません。g->eおそらく、表現の 1 つは?であるはずでした。

いずれにせよ、書かれたコードの場合、g->v最初にスキャンされた番号になるか、2 番目にスキャンされた番号になるかは予測できません。Andg->eは初期化されていませんが、後のループで使用します。

また、削除された回答で BSH が指摘したように、sizeof((g->v)*(g->v))最新のマシンでは 4 と評価されます。欲しいもの: malloc(g->v * g->e * sizeof(int)). そして、あなたはadjそうint*ではありませんint**

valgrindまたはアドレスサニタイザーを使用して、このようなバグの修正を見つけてください。

于 2013-10-27T18:54:12.267 に答える