2015-10-15 57 views
-2

我對我開始的程序進行了一些更改:但由於另一個原因,我收到了分段錯誤。它發生在我的輸出之後,我認爲它可能與我在destroy函數中的自由聲明有關。我通過gdb運行它,它告訴我我試圖訪問一個0X000000d的內存位置,這很奇怪,因爲我可以打印出我的結構的內存位置,並顯示出不同的內容。我知道我可能錯過了一些非常小的東西。任何幫助將不勝感激謝謝!程序運行並顯示輸出後,分段錯誤核心轉儲

不得不把m代碼放下,因爲它是一個正在進行的項目在學校感謝答覆,我會將它發回,一旦我們有一個成績。

+0

編譯器沒有警告在未初始化時使用'UserOne'嗎? – EOF

+0

與您的問題無關的小記事:['assert'宏](http://en.cppreference.com/w/c/error/assert)不應該用於檢查有效參數或未能分配那。首先它可能被禁用,根據特定的條件什麼也不做,其次如果斷言失敗,那麼程序將在當時被中止,而普通「用戶」所使用的任何程序都不會發生該程序。 –

回答

1

您有未定義的行爲在您的代碼中。

走這條線:

struct Person *UserOne=inputvalues(UserOne); 

在這裏,你定義一個變量UserOne並通過調用功能,爲您傳遞未初始化指針初始化。這意味着在函數中,temp指針未初始化,並且其值不確定當您取消引用指針時導致所述UB。

一種可能的解決方案是定義的結構變量,它是不一個指針,並調用時使用它,或通過動態地分配的結構,並且傳遞給函數。或者重新設計程序,以便根本不向函數傳遞參數,並讓函數本身分配結構。

像這樣使用未初始化的變量很容易被編譯器檢測到,並且大多數可以發出警告。如果你沒有得到這樣的警告,你可能會考慮啓用更多的警告。

+0

@EOF沒有辦法說,真的。 UB是UB。 –