- 資料區 (Data segment)︰ 全域變數, static 變數,常數。
- 堆疊區 (Stack)︰ 區域變數 (Auto variable), 函式參數,暫時變數。
- Heap 區︰ 動態配置的記憶體。
當程式開始時,全域變數以及static變數、
常數皆會於宣告完成的時候放到data segment裡,從此你儂我儂科科與程式共存亡。
常數皆會於宣告完成的時候放到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()的使用方式:
使用malloc()後盡量記得以free()來釋放記憶體,
因為malloc()就是叫系統別管你用它做什麼,直到天荒地老。
也因此可以拿來在函式中存放想回傳的資料而不會被清掉,相當方便。
free()的使用方式:
free(ptr); ptr = 0; // 習慣上在釋放後自行將ptr的指向去除, // 因為這時再度存取那個位址肯定會出錯。
沒有留言:
張貼留言