看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) g++ linux 有一台工作站可以跑12個input通通都沒錯, 有一台不行跑12個input, 有四個都出現同樣的segmentation fault, 發生位置都相同 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) no 問題(Question): float * slength = (float *) calloc(nLines, sizeof(float)); for loop{ slength[i] = sqrtf(lines[i*6+1]-lines[i*6+0]) + square(lines[i*6+3]-lines[i*6+2]); } for loop{ float s1 = min(slength[i], slength[j]); } 可是在最後一個for loop的時候, 當到某一輪的時候, slength這個指標會換位置, 導致我存取這條的時候就會segmentation fault 會知道指標換位置是因為我用printf("%d", slength); 本來都一直是143630752, 可是某一輪進入loop的時候變成了1048625980 請問這有可能是什麼原因造成的呢? 餵入的資料(Input): 預期的正確結果(Expected Output): 應該要沒有segmentation fault 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.33.208.33
LPH66:你檢查一下有沒有陣列存取超出範圍 08/18 14:30
LPH66:(不只有要來的還包含你在函式內宣告的都檢查一下) 08/18 14:31
LPH66:例如那個 line 也許有可能... 08/18 14:32
LPH66:我是說 lines 陣列 08/18 14:32
guanrulee:OK 我險察一下 08/18 14:44
james732:linux底下有個好工具叫「valgrind」可以看看 08/18 14:48
angleevil:ptt有個超哥叫「james732」,不過valgrind不錯 08/18 14:53
謝謝大家幫忙^^ 真的是有個陣列只宣告了8個位置, 陣列的INDEX在某一次的時候等於8, 而超過宣告的數量了, ======= 不過我在用Valgrind的時候, 他只會顯示我的執行檔名字, 我看網路上別人的教學文章中, 他的還會寫是哪個.c檔且第幾行出錯都會寫出來, http://endlesschildhood.blogspot.com/2010/01/valgrind-tutorial.html 我是照著這一篇的講解跑的 --leak-check=full --log-file=vglog 用了這兩個參數, 我的code是有25個.cpp檔(一個main.cpp), 還有24個相對應的.h檔 是因為我比較多檔案所以他寫不出是哪個檔案第幾行嗎? 謝謝 ※ 編輯: guanrulee 來自: 114.33.208.33 (08/18 17:34) ※ 編輯: guanrulee 來自: 114.33.208.33 (08/18 17:35)
james732:g++編譯的時候加上 -g 試試 08/18 17:49
真的加了就ok了 謝謝樓上^^ ※ 編輯: guanrulee 來自: 1.175.132.15 (08/18 19:08)