簡體   English   中英

指針(?)使C程序崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM