我尝试为动态“ MapNode”数组使用新结构,但程序崩溃:


  Astar.exe中0x000C191C处未处理的异常:0xC0000005:访问冲突读取位置0xCCCCCCCC。


我调用了getConnectedNodesArray函数,该函数调用了其他两个函数。
我知道这是某种指针问题。
当我使用数据副本而不是尝试指向MapNode map [] [12]中的现有数据时,它可以工作。

谢谢。

typedef struct MapNode * MapNodePointer;


typedef struct MapNode{
    int x;
    int y;
    int value;
    int traversable;
    double f;
    double g;
    double h;
    MapNodePointer parentNode;
}MapNode;


typedef struct MapNodesArray{
    MapNode* nodes;
    int size;
}MapNodesArray;

void addNodeToEnd(MapNodesArray* arr, MapNode* p) {
    arr->size++;
    arr->nodes = realloc(arr->nodes, arr->size * sizeof(MapNode*));
    (&(arr->nodes))[arr->size - 1] = p;
}

MapNodesArray* NewNodesArr() {
    MapNode *first = realloc(NULL, 0 * sizeof(MapNode));
    MapNodesArray temp = { first, 0 };
    return &temp;
}

MapNodesArray* getConnectedNodesArray(MapNodePointer node, MapNode map[][12]) {
    MapNodesArray* arr = NewNodesArr();
    addNodeToEnd(&arr, &map[node->x - 1][node->y - 1]);
    return arr;
}

最佳答案

您似乎害怕间接性。正面面对,并确保获得所需的确切金额:

typedef struct MapNode * MapNodePointer;


上面是一个坏主意,因为它隐藏了指针性。

typedef struct MapNodesArray{
    MapNode* nodes;
    int size;
}MapNodesArray;


上面的结构不利于存储指向节点的动态指针列表。 nodes成员还需要一颗星:MapNode** nodes;

void addNodeToEnd(MapNodesArray* arr, MapNode* p) {
    arr->size++;
    arr->nodes = realloc(arr->nodes, arr->size * sizeof(MapNode*));


有一种更好的方法来指示所需的内存量:arr->size * sizeof *arr->nodes始终检查分配失败。准骨将中止该程序。在这里插入:

    if(!arr->nodes) abort();


现在,编译器将正确地抱怨下一行,只需删除操作者的地址即可:

    (&(arr->nodes))[arr->size - 1] = p;
}

MapNodesArray* NewNodesArr() {
    MapNode *first = realloc(NULL, 0 * sizeof(MapNode));


上面的行可以替换为MapNode* first = 0;

    MapNodesArray temp = { first, 0 };


上面的代码行定义了一个自动变量,从不返回指向该变量的指针。

    return &temp;
}


哎呀完全重写:

MapNodesArray* NewNodesArr() {
    MapNodesArray temp* = malloc(sizeof *temp);
    *temp = (MapNodesArray){ 0, 0 };
    return temp;
}


甚至更好:

MapNodesArray NewNodesArr() {
    return (MapNodesArray){ 0, 0 };
}

关于c - 指针(?)使C程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24840526/

10-11 22:59
查看更多