2010-06-08 59 views
-1

我患有意想不到的行爲;這裏是問題定義:ansi c意外行爲的問題?

我有應用程序通過UDP協議在局域網上進行通信。我正在從文本文件中讀取IP地址和端口號。最初,IP地址和端口號可以很好地工作,但過了一段時間後,存儲在char數組中的IP地址就會損壞,並且會佔用垃圾值。此外,文件寫入受此影響。我的意思是IP數組中的值也寫在同一個應用程序編寫的文本文件中。我不明白是什麼問題 - 你能幫忙嗎?

+2

請張貼一些代碼 – 2010-06-08 08:13:37

+1

-1對於語言錯誤(即使在標準庫中也是如此!)。你的代碼顯然存在問題 - 它破壞了緩衝區。 – qrdl 2010-06-08 08:15:56

回答

7

這幾乎肯定意味着你有一個緩衝區溢出 - 甚至可能是堆棧溢出。您可能將太多字節讀入太小的字節數組中,並且超出了分配空間的末尾並踐踏您的其他數據(如IP地址)。

如果您使用的是Linux,請考慮使用valgrind來幫助診斷問題。

+1

您的評論與我的相似,它幾乎是不可思議的。 ;) – Artelius 2010-06-08 07:07:49

7

這很可能是由於訪問某些數組的邊界以外。這也可能是未初始化的指針問題。

如果您使用的是Linux,請嘗試在valgrind下運行您的程序。 確保你的所有陣列都足夠大。考慮加入assert() s來檢查你的數組索引是否正確以及那種事情。

+1

你的答案與我的相似,它幾乎是不可思議的。 – 2010-06-08 07:06:02

0

如果您使用memcpy()複製數據,請檢查您是使用正確的大小參數,還是使用strcpy()確保將空字符串傳遞給strcpy() memcpy的大小不正確或者在傳遞給strcpy()的末尾沒有空字符的字符串將導致這些函數寫入超出目標緩衝區的預期邊界並導致內存損壞。 可能有其他原因,例如一個不正確的終止條件等迴路。 請在這裏粘貼你的代碼,以便我們可以看看。

0

像其他人一樣,在這裏提到,如果你是Linux/UNIX並且同時使用調試器,則使用valgrind。嘗試運行:

valgrind --db-attach=yes --db-command=</path/to/gdb -nw %f %p> 

對於錯誤的第一個實例,valgrind將停止並提示您附加調試器。

夫婦秋後算賬的:

  1. 檢查您是否使用固定大小的數組。東西像char buf [128];可能看起來很可愛,但是價格比毛絨松鼠
  2. 沒有得到()和看跌期權()系統調用請在主

名稱使用STL字符串或crope嘗試,因爲你無論工作雪上加霜。