2013-05-05 52 views
0

這裏的另一個成員一個類的成員指針被garbaged是我現在有這個問題:當數據被複制到

class Header{ 

    //something here 

}; 

class Packet{ 

    public: 

     Packet(Header* _header){ 
      header = _header; 
     }; 

     char buf[1000]; 

     Header* header; 
} 

因此,它看起來那麼簡單。當我創建一個Header(_header),然後用它作爲參數來創建一個數據包時,在調試器中一切都很好:數據包的指針頭確實指向之前創建的_header。

現在,我開始加載1000個字符到buf。對於前幾百個字符,事情仍然看起來不錯。但是,當複製到buf的字符數量變大(大約800)時,數據包的指針頭突然變得亂碼。不知道爲什麼。後來當我嘗試訪問創建的數據包的頭部時,這是一個垃圾地址,程序崩潰了。

我嘗試了兩種加載buf的方式(通過strcpy和一個一個的複製,如buf[i]=...),但仍然面臨同樣的問題。

任何可以幫助澄清或解決這個問題嗎? 謝謝

+1

無論'_header'指向可能超出範圍。 – chris 2013-05-05 03:19:36

+0

Barmar,你是如何編輯代碼的?我試圖格式化它時很掙扎。 – Simo 2013-05-05 03:22:50

+0

@Simo我只是增加了空格。注意TAB字符,他們不正確格式。 – Barmar 2013-05-05 03:23:24

回答

2

通過交換類中頭和buf的定義,您可以發現超出數組邊界的問題。將其更改爲

Header* header; 
char buf[1000]; 

並且將buf溢出到頭文件中不會成爲問題。你仍然必須找出緩衝區溢出的問題。

+3

這隻會溢出到別的東西,它不是真的一個辦法。 – Barmar 2013-05-05 03:26:15

+0

確實。我交換了職位,問題沒有了。現在我發現我寫了超過1000個字符的buf。傻我。謝謝。 – Simo 2013-05-05 03:27:11

2

此問題表示您正在寫入超出其範圍的buf。確保你永遠不會超出第1000個指數,你會沒事的。

+0

他說問題發生在他達到800左右時。 – Barmar 2013-05-05 03:22:51

+0

@Barmar這是事實,但你能想到任何其他原因,只有當他達到一個更大的數字時纔會發生?我們需要更多的代碼才能完全確定 – nullptr 2013-05-05 03:26:35

+0

我同意,這就是爲什麼我發表評論要求他顯示相關代碼。 – Barmar 2013-05-05 03:27:15

0

由於您正在傳遞Header * _header,因此您在類Packet中存儲的位置處的數據不受該類的管理。如果分配這個內存的人發生了什麼情況,它將反映在Packet類中對它的引用中。 初始化傳入Packet構造函數的值的代碼在哪裏?我想你的問題在那裏。它在堆棧上嗎?你叫新的?我敢打賭,這是一個你傳遞給構造函數的棧變量。