簡體   English   中英

在C中使用realloc更改了內存地址

[英]Changed memory address using realloc in C

我確實對C語言中的內存重新分配有疑問,因為我認為這引起了我一個星期沒有找到的問題。 我是您有方格紙,您的某人用綠色填充了幾個方格。 因此,現在,我嘗試讀取綠色方塊的坐標(有人將它們放入標准輸入),然后通過查看它們是否相鄰將它們鏈接在一起。 因此,在Cell結構中,所有Cell都具有坐標,指向潛在鄰居的指針以及鄰居的計數器。 還有一個名為setNeighbours的函數,該函數確定它們是否是鄰居,並將地址填充到每個對象中。 所以我的問題是關於重新分配方法的,因為我知道這可能會將地址塊移到其他地方,並且由於這個原因,有時(也許是40%的時間)在打印結果時得到錯誤的結果。

代碼如下。 我知道重新分配行是原因,因為如果我確實刪除了它,並在malloc行中放入了足夠的空間,那么以后就不需要重新分配,那么一切正常。 我猜有一個愚蠢的時刻,我在呼喚一個以前已經改變過的舊地址,但是我看不到它。 有人看到嗎?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>

typedef struct Square {
    long index;
    long x;
    long y;
    struct Square *Above;
    struct Square *Below;
    struct Square *Right;
    struct Square *Left;
    int count;
} SquareType;

SquareType *cellArr;
long countSquares = 0;

輸入示例:

1 3
2 3
3 3
2 2
2 1
3 2

所以我的問題是關於重新分配方法的,因為我知道這可能會將地址塊移到其他地方,並且由於這個原因,有時(也許是40%的時間)在打印結果時得到錯誤的結果。

實際上, realloc()並不總是將重新分配的塊放在與原始塊相同的地址上。 如果您重新分配包含結構的空間,則必須假定重新分配之前獲得的指向那些結構的所有指針均不再有效。 您的代碼似乎沒有做這個假設。

只有幾種可行的解決方案:

  • 除了維護指向空間開頭的主要指針之外,不要依賴於分配的空間中的指針。 一種實現方法是通過鄰居的索引而不是通過直接指向鄰居的指針來識別鄰居。 要么,

  • 僅在讀取所有數據之后設置指針,以確保可以執行所有需要的重新分配。 要么,

    • 特殊情況:每當將數據重新分配到其他地址時,重新計算所有指針。 要么,
  • 避免重新分配。 您可以通過為所有事物分配足夠的空間(如果有的話,或者可以至少獲得所需數量的合理上限),或者通過獨立地分配每個結構來做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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