C 語言只有值傳遞。函數參數 int *p 接收的是呼叫端指標變數的位址值副本。函數內 p = malloc(...) 修改的是區域副本,呼叫端原指標仍指向原位址(通常為 NULL/隨機值),導致後續解參考崩潰。
void alloc(int *p) {
p = malloc(sizeof(int)); // 修改區域副本
*p = 10;
}
int main() {
int *ptr = NULL;
alloc(ptr);
printf("%d", *ptr); // Segmentation fault:ptr 仍為 NULL
}
void alloc(int **p) { // 接收指標的位址
*p = malloc(sizeof(int)); // 解參考修改原指標指向
**p = 10;
}
int main() {
int *ptr = NULL;
alloc(&ptr); // 傳遞 ptr 的位址
printf("%d", *ptr); // 10
free(ptr);
}
| 運算式 | 意義 | 型別 |
|---|---|---|
*p | 解參考:存取 p 指向的記憶體 | int (若 p 為 int*) |
&p | 取址:獲得指標變數本身的位址 | int** (若 p 為 int*) |
*&p | 先取址再解參考,等價於 p 本身 | int* |