1. 程式人生 > >C語言面試題---指標篇(二)

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

  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>
  4. void getMemory( char **p , int num)
  5. {
  6. *p = malloc(num);
  7. }
  8. int main()
  9. {
  10. char * str = NULL;
  11. getMemory(&str,100);
  12. strcpy(str,"hello");
  13. free(str);
  14. if(str != NULL)
  15. {
  16. printf("%p\n",str);
  17. }
  18. return 0;
  19. }

程式運行的結果輸出的是指標物件str的值。

在給指標分配記憶體的時候,其實給指標物件賦了了一個值,這個值就是這片空間的首地址。

隨後進行了free操作,free 只是釋放的str指向的記憶體空間,它本身的值還是存在的.

因為記憶體空間已經被釋放了,所以這個指標物件的值,其實是指向沒有被分配空間的地址,

如果輸出語句之前還存在分配空間的操作的話,這段儲存空間是可能被重新分配給其他變量的,

訪問這樣的越界空間,編譯是沒有問題的,但是運行時會出現“Segmentation fault”.

所以free之後,有一個好的習慣就是將str=NULL.

不過在該程式中,如果輸出str的值,通常還是會打印出hello來。

這是因為,程序中的記憶體管理理一般不是由作業系統完成的,而是由庫函式自己完成的。

當你malloc一塊記憶體的時候,管理庫向作業系統申請一塊空間(可能會比你申請的大一些),

然後在這塊空間中記錄一些管理資訊(一般是在你申請的記憶體 前面一點),並將可用

記憶體的地址返回。但是釋放記憶體的時候,管理庫通常都不會將記憶體還給作業系統,

也可以理解成為不會立即清除記憶體空間中的內容的,因此你是可以繼續訪問這塊地址的。