8. 內存分配
- 8.1 為什麼這段代碼不行?char *answer;
printf("Type something:\n");
gets(answer);
printf("You typed
\"%s\"\n",
answer);
- 8.2 我的 strcat() 不行.我試了
char *s1 = "Hello, "; char *s2 =
"world!"; char *s3 = strcat(s1, s2);
但是我得到了奇怪的結果。
- 8.3 但是 strcat 的手冊頁說它接受兩個 char * 型參數。
我怎麼知道 (空間) 分配的事情呢?
- 8.4 我剛才試了這樣的代碼
char *p;
strcpy(p, "abc"); 而它運行正常?怎麼回事?
為什麼它沒有崩潰?
- 8.5 一個指針變量分配多少內存?
- 8.6 我有個函數, 本該返回一個字符串, 但當它返回調用者的時候,
返回串卻是垃圾信息。
- 8.7 那麼返回字符串或其它集合的爭取方法是什麼呢?
- 8.8 為什麼在調用 malloc() 時, 我得到 ``警告:
整數賦向指針需要類型轉換"?
- 8.9 為什麼有些代碼小心地把 malloc 返回的值轉換為分配的指針類型。
- 8.10 在調用 malloc() 的時候, 錯誤 ``不能把 void * 轉換為 int *"
是什麼意思?
- 8.11 我見到了這樣的代碼
char *p = malloc(strlen(s) + 1);
strcpy(p, s);
難道不應該是 malloc((strlen(s) + 1) * sizeof(char))?
- 8.12 我如何動態分配數組?
- 8.13 我聽說有的操作系統程序使用的時候才真正分配 malloc 申請
的內存。這合法嗎?
- 8.14 我用一行這樣的代碼分配一個巨大的數組, 用於數字運算:
double *array = malloc(300 * 300 * sizeof( double ));
malloc() 並沒有返回 null, 但是程序運行得有些奇怪, 好像改寫了某些內存,
或者 malloc() 並沒有分配我申請的那麼多內存, 云云。
- 8.15 我的 PC 有 8 兆內存。為什麼我只能分配 640K 左右的內存?
- 8.16 我的程序總是崩潰, 顯然在 malloc 內部的某個地方。 但是我看不出
哪裡有問題。是 malloc() 有 bug 嗎?
- 8.17 動態分配的內存一旦釋放之後你就不能再使用, 是吧?
- 8.18 為什麼在調用 free() 之後指針沒有變空?使用 (賦值, 比較)
釋放之後的指針有多麼不安全?
- 8.19 當我 malloc() 為一個函數的局部指針分配內存時, 我還需要用
free() 明確的釋放嗎?
- 8.20 我在分配一些結構, 它們包含指向其它動態分配的對象的指針。
我在釋放結構的時候, 還需要釋放每一個下級指針嗎?
- 8.21 我必須在程序退出之前釋放分配的所有內存嗎?
- 8.22 我有個程序分配了大量的內存, 然後又釋放了。但是從操作系統看,
內存的佔用率卻並沒有回去。
- 8.23 free() 怎麼知道有多少字節需要釋放?
- 8.24 那麼我能否查詢 malloc 包, 可分配的最大塊是多大?
- 8.25 向 realloc() 的第一個參數傳入空指針合法嗎?你為什麼要這樣做?
- 8.26 calloc() 和 malloc() 有什麼區別?利用 calloc 的零填充功能安全嗎?
free() 可以釋放 calloc() 分配的內存嗎, 還是需要一個 cfree()?
- 8.27 alloca() 是什麼?為什麼不提倡使用它?
翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)