| 術語 | 解釋 | 示例 |
|---|---|---|
| 作用域 | 標識符可訪問的程序區域 | 塊、函數、函數原型、文件 |
| 鏈接 | 變量跨文件可見性 | 外部、內部、無 |
| 存儲期 | 對象生命週期 | 靜態、線程、自動、動態分配 |
| 翻譯單元 | 編譯單元:源文件+頭文件 | —. |
{ } 內,C99 允許循環語句形成塊。無鏈接。goto 標簽。無鏈接。extern。static 修飾文件級變量。malloc/free)。| 存儲類別 | 存儲期 | 作用域 | 鏈接 | 聲明方式 |
|---|---|---|---|---|
| 自動 | 自動 | 塊 | 無 | 塊內 |
| 靜態外部鏈接 | 靜態 | 文件 | 外部 | 函數外,引用需 extern |
| 靜態內部鏈接 | 靜態 | 文件 | 內部 | 函數外,static |
| 靜態無鏈接 | 靜態 | 塊 | 無 | 塊內,static |
內存佈局:靜態區(含常量)、棧區(自動)、堆區(動態)。
int *ptr, n = 10; ptr = (int *)malloc((size_t)n * sizeof(int)); if (ptr == NULL) exit(EXIT_FAILURE); // 必須檢查 // 使用 ptr ... free(ptr); // 及時釋放,防內存洩漏
或合寫:if (!(ptr = malloc(...))) exit(EXIT_FAILURE);
注意:若指針丟失未 free,造成內存洩漏,嚴重時耗盡系統內存導致崩潰。

#include <stdio.h>, <stdlib.h>, <conio.h>
int main() {
int *ptr, size, i, j, key;
printf("請輸入動態數組大小:");
while (!(scanf("%d", &size)) || size < 0) { /* 重輸 */ }
if (!(ptr = malloc((size_t)size * sizeof(int)))) { /* 失敗退出 */ }
printf("請依次輸入元素:\n");
for (i = 0; i < size; i++) scanf("%d", &ptr[i]);
/* 插入排序 */
for (i = 1; i < size; i++) {
key = ptr[i]; j = i - 1;
while (j >= 0 && ptr[j] > key) { ptr[j+1] = ptr[j]; j--; }
ptr[j+1] = key;
}
printf("排序後:");
for (i = 0; i < size; i++) printf("%d ", ptr[i]);
free(ptr); _getch(); return 0;
}

void *realloc(void *ptr, size_t size);
ptr 指向塊大小為 size,內容保留(截斷或擴展)。NULL 且原塊不釋放。ptr == NULL 等價 malloc(size);size == 0 等價 free(ptr)。風險:失敗時原地址丟失導致洩漏。使用前務必備份原指針。不建議大量依賴。