閱讀下面的程式,找出其中的錯誤,並說明原因。
# include int main()
答案:該程式會段錯誤,因為程式中僅僅只定義了乙個字元指標,並沒有定義字元串,
只是將字元指標指向了「abcd」這個字元串常量了,而字元串常量"abcd"的儲存位置是在
記憶體的資料段(或靜態儲存區)中的,儲存在這個位置的值,是不允許修改的,
因此在程式中使用 str[2] ='f' 試圖修改字串常量的值,就會出現段錯誤,當然,
我們可能等不到段錯誤的出現,因為程式在編譯階段就會被報警告了。
靜態儲存區的作用非常重要,但是對於我們而言最重要的還是棧區和堆區。對於堆區而言,
重要的就是malloc函式和free函式,一起來看一道關於堆區的題目:
# include # include # include void getmemory( char **p , int num)
int main()
return 0;
}
程式運行的結果輸出的是指標物件str的值。
在給指標分配記憶體的時候,其實給指標物件賦了了乙個值,這個值就是這片空間的首位址。
隨後進行了free操作,free 只是釋放的str指向的記憶體空間,它本身的值還是存在的.
因為記憶體空間已經被釋放了,所以這個指標物件的值,其實是指向沒有被分配空間的位址,
如果輸出語句之前還存在分配空間的操作的話,這段儲存空間是可能被重新分配給其他變量的,
訪問這樣的越界空間,編譯是沒有問題的,但是運行時會出現「segmentation fault」.
所以free之後,有乙個好的習慣就是將str=null.
不過在該程式中,如果輸出str的值,通常還是會列印出hello來。
這是因為,程序中的記憶體管理理一般不是由作業系統完成的,而是由庫函式自己完成的。
當你malloc一塊記憶體的時候,管理庫向作業系統申請一塊空間(可能會比你申請的大一些),
然後在這塊空間中記錄一些管理資訊(一般是在你申請的記憶體 前面一點),並將可用
記憶體的位址返回。但是釋放記憶體的時候,管理庫通常都不會將記憶體還給作業系統,
也可以理解成為不會立即清除記憶體空間中的內容的,因此你是可以繼續訪問這塊位址的。
C語言面試題 指標篇(一)
指標的使用,一直是c語言面試題中必考的部分,因為指標本身使用的複雜性與普適性,所以考點非常多,而且也可以與其他知識相互結合,因此我們將會使用五篇專題的篇幅來介紹指標。分析下面的程式,指出程式中的錯誤 include int main void 沒有正確為str分配記憶體空間,將會發生異常。問題出在將...
C語言面試題 指標篇(一)
指標的使用,一直是c語言面試題中必考的部分,因為指標本身使用的複雜性與普適性,所以考點非常多,而且也可以與其他知識相互結合,因此我們將會使用五篇專題的篇幅來介紹指標。分析下面的程式,指出程式中的錯誤 include intmain void 沒有正確為str分配記憶體空間,將會發生異常。問題出在將乙...
C語言面試題高階篇
1.判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?首先判斷是否帶環,在這裡用快慢指標,快指標每次走兩步,慢指標每次只走一步,無環的快指標會先走到頭,如果快指標等於慢指標那麼說名單鍊錶存在環,會返回 相遇點,如果無環會返回 空指標。為什麼乙個走兩步乙個走一步就可以呢,因為fast比slow走的...