C語言面試題 指標篇(二)

2021-08-13 22:08:38 字數 1210 閱讀 9625

閱讀下面的程式,找出其中的錯誤,並說明原因。

# 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走的...