我尝试为动态“ 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/