1

私は2つのコードを持っています:

gb_Graph = (int **)malloc(sizeof(int*)*gb_nVertices);


if (gb_Graph == NULL)
    return false;


gb_Open = (VERTEX *)malloc(sizeof(VERTEX*)*gb_nVertices);
if (gb_Open == NULL)
    return false;


gb_Close = (VERTEX *)malloc(sizeof(VERTEX*)*gb_nVertices);
if (gb_Close == NULL)
    return false;


for (i = 0; i < gb_nVertices; i++)
{
    gb_Graph[i] = (int*)malloc(sizeof(int)*gb_nVertices);

    if (gb_Graph[i] == NULL)
        return false;

    for (j = 0; j<gb_nVertices; j++)
        fscanf(gb_fInput, "%d", &(gb_Graph[i][j]));
}


for (i = 0 ; i<gb_nVertices; i++)
{
    gb_Open[i].Exist = false;
    gb_Open[i].ParentName = -1;
    gb_Open[i].CostPath = 0;
    fscanf(gb_fInput, "%d", &(gb_Open[i].CostHeuristic));

    gb_Close[i].Exist = false;
    gb_Close[i].ParentName = -1;
    gb_Close[i].CostPath = 0;
    gb_Close[i].CostHeuristic = gb_Open[i].CostHeuristic;
}

gb_Open[gb_nStart].Exist = true;

gb_Graph = (int **)malloc(sizeof(int*)*gb_nVertices);
if (gb_Graph == NULL)
    return false;


for (i = 0; i < gb_nVertices; i++)
{
    gb_Graph[i] = (int*)malloc(sizeof(int)*gb_nVertices);

    if (gb_Graph[i] == NULL)
        return false;

    for (j = 0; j<gb_nVertices; j++)
        fscanf(gb_fInput, "%d", &(gb_Graph[i][j]));
}


gb_Open = (VERTEX *)malloc(sizeof(VERTEX*)*gb_nVertices);
if (gb_Open == NULL)
    return false;


gb_Close = (VERTEX *)malloc(sizeof(VERTEX*)*gb_nVertices);
if (gb_Close == NULL)
    return false;


for (i = 0 ; i<gb_nVertices; i++)
{
    gb_Open[i].Exist = false;
    gb_Open[i].ParentName = -1;
    gb_Open[i].CostPath = 0;
    fscanf(gb_fInput, "%d", &(gb_Open[i].CostHeuristic));

    gb_Close[i].Exist = false;
    gb_Close[i].ParentName = -1;
    gb_Close[i].CostPath = 0;
    gb_Close[i].CostHeuristic = gb_Open[i].CostHeuristic;
}

gb_Open[gb_nStart].Exist = true;

最初のコードでは、エラーが発生します。ファイルから値を読み取った後にブレークポイントを 2 つのコードで gb_Graph 変数に入れても、違いはありません。しかしその後、gb_Open[gb_nStart].Exist = true; にブレークポイントを設定します。、最初のコードでは、gb_Graph の値が変更されます。

それがメモリ割り当ての順序だと思います。右?

変数を使用:

VERTEX *gb_Open;    
VERTEX *gb_Close;       
int **gb_Graph;         

なぜ間違っているのか説明してください。私はVS C++ 2012を使用しています

4

1 に答える 1

5

これらは両方とも間違っています:

gb_Open = (VERTEX *)malloc(sizeof(VERTEX*)*gb_nVertices);
if (gb_Open == NULL)
    return false;

gb_Close = (VERTEX *)malloc(sizeof(VERTEX*)*gb_nVertices);
if (gb_Close == NULL)
    return false;

のスペースを割り当てています。gb_nVertices * sizeof(VERTEX*)つまり、gb_nVertices ポインター用のスペースです。が必要sizeof(VERTEX)で、安全のために、構文逆参照を使用します。

gb_Open = malloc(sizeof(*gb_Open)*gb_nVertices);
if (gb_Open == NULL)
    return false;

gb_Close = malloc(sizeof(*gb_Close)*gb_nVertices);
if (gb_Close == NULL)
    return false;

2 番目のコード ブロックにも同じ問題があります。

また、in Cの結果をキャストしないmalloc()でください。

于 2013-10-20T06:36:21.577 に答える