2013年1月17日 星期四

[C Programming] data segment、heap以及stack

在C語言中存放資料的地方有三種:
  1. 資料區 (Data segment)︰ 全域變數, static 變數,常數。
  2. 堆疊區 (Stack)︰ 區域變數 (Auto variable), 函式參數,暫時變數。
  3. Heap 區︰ 動態配置的記憶體。
當程式開始時,全域變數以及static變數、
常數皆會於宣告完成的時候放到data segment裡,從此你儂我儂科科與程式共存亡。

值得注意的是static變數的可見範圍只在宣告的scope內,
離開所宣告的層級(比如function的大括號)後,就存取不到它了。
常數則是指被宣告為const的char array。
有人說const int就照舊放在stack,但我所學不精無法驗證。
以上這些資料都會放在data segment。

stack中擺的則是大部分會變動的東西。
任何"暫時性"的東西大概都擺在這。

heap中擺的只有一種,就是你用malloc來配置的記憶體空間。
好的使用習慣是配合sizeof()來指定大小,比如說:

 int *ptr;
 ptr = (int *)malloc(sizeof(int)*5);
 int i,j;
 for(i=0;i<5;i++)
    ptr[i]=i;
 for(j=0;j<5;j++)
    printf("%d\n", ptr[j]);
上面的範例配置了長度為5個int大小的int array,並且使用ptr來存取。
使用malloc()後盡量記得以free()來釋放記憶體,
因為malloc()就是叫系統別管你用它做什麼,直到天荒地老。
也因此可以拿來在函式中存放想回傳的資料而不會被清掉,相當方便。
free()的使用方式:

 
 free(ptr); 
 ptr = 0; // 習慣上在釋放後自行將ptr的指向去除,
          // 因為這時再度存取那個位址肯定會出錯。



沒有留言:

張貼留言