gpt4 book ai didi

c - 指针(?)导致 C 程序崩溃

转载 作者:行者123 更新时间:2023-11-30 18:40:49 25 4
gpt4 key购买 nike

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

Unhandled exception at 0x000C191C in Astar.exe: 0xC0000005: Access violation reading location 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** 节点;

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com