所以我有一個程序,其中有這樣的事情在裏面:如果我在fortran中調用一個函數,而沒有定義一個變量,會發生什麼?
integer :: mgvn, stot, gutot, iprint, iwrit, ifail, iprnt
...
call readbh(lubnd,nbset,nchan,mgvn,stot,gutot,nstat,nbound,rr,bform,iprnt,iwrit,ifail)
然後裏面readbh
:
CALL GETSET(LUBND,NSET,KEYBC,BFORM,IFAIL)
IF(IFAIL.NE.0) GO TO 99
...
99 WRITE(IWRITE,98) NBSET,LUBND
IFAIL = 1
RETURN
,所有的其它變量的定義,但ifail
不是。如果我在函數調用之前添加write(*,*) ifail
,我會得到未定義的變量錯誤,但是如果我忽略它,它不會發出抱怨,並且會隨函數一起運行,並且總是失敗,並且IFAIL=1
。
這是因爲它剛開在readbh
函數的參數結束,讀取未初始化的內存 - 這僅僅是隨機jibberish - 然後鑄造那些位的int
- 這不會是零,除非我'非常(非)幸運,所以幾乎總是讓ifail.ne.0
true
?
您是不是定義了ifail,還是將它從調用參數列表中刪除?訪問一個未定義的變量就是未定義的。它可能爲零,或者可能是垃圾發生在該內存位置。如果您訪問的子程序中甚至沒有提供的參數,您可能會遇到seg故障。 – agentp
「-Wuninitialized」標誌有一個原因...... –