C中的内存分配顺序导致写入变量错误?

Trị*_*Tâm 1 c

我有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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

在第一个代码中,它会导致错误.如果我在从文件读取值到2个代码中的gb_Graph变量之后放置断点,则没有区别.但在那之后,在gb_Open中设置一个断点[gb_nStart] .Exist = true; 在第一个代码中,修改了gb_Graph的值.

我认为这是内存分配的顺序.对?

随变量:

VERTEX *gb_Open;    
VERTEX *gb_Close;       
int **gb_Graph;         
Run Code Online (Sandbox Code Playgroud)

请解释一下为什么错了?我使用VS C++ 2012

Who*_*aig 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;
Run Code Online (Sandbox Code Playgroud)

你正在分配空间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;
Run Code Online (Sandbox Code Playgroud)

第二个代码块中存在同样的问题.

另请注意,不要malloc()在C中强制转换结果.