![](/img/trans.png)
[英]try to find middel but program crash linked list in c with two pointers
[英]Pointers(?) crash the C program
我嘗試為動態“ 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;
一個星: 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 };
}
你到底想多少內存
MapNodesArray* NewNodesArr() {
MapNode *first = realloc(NULL, 0 * sizeof(MapNode));
MapNodesArray temp = { first, 0 };
return &temp;
}
會分配? (提示:完全沒有。)
同樣,您將返回一個指向局部變量的指針(通過&temp
)。 那東西隨着函數的返回而死亡。
同意EOF所說的話,也是
(&(arr->nodes))[arr->size - 1] = p;
在addNodeToEnd函數中,將在節點數組外部的內存位置寫入地址p。 這將導致內存損壞。
舉例說明,變量“節點”的內存地址為0x00000002,您通過調用realloc分配了一個內存位置,例如0x00000050。 上面的語句從0x00000002獲取偏移量(arr-> size-1),而不是從0x00000050獲取偏移量。 這是因為您要使用&來獲取節點的地址。 形式的東西
(arr->nodes)[arr->size - 1] = p;
將采用您似乎需要的0x00000050的偏移量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.