void Set(struct Process *L) {
struct Process Demo;
L = &Demo; // 嘗試修改實參指向
printf("%p\n", L);
}
int main() {
struct Process *L = NULL;
Set(L);
if (L) { ... } else printf("L地址為NULL\n"); // 輸出 NULL
}
L 是主調函數指針變量的**副本**。Set 內部 L = &Demo 只修改了**副本**指向棧上局部變量 Demo。L 仍指向 NULL。Demo 是局部變量,函數返回後內存無效,即使修改成功也是懸空指針。void Set(struct Process **L) { // 接受指針地址
struct Process *Demo = malloc(sizeof(struct Process));
*L = Demo; // 通過解引用修改主調指針指向
}
int main() {
struct Process *L = NULL;
Set(&L); // 傳遞指針變量的地址
// 此處 L 已指向新分配的內存
free(L); // 記得釋放
}
struct Process* CreateProcess() {
struct Process *p = malloc(sizeof(struct Process));
return p;
}
int main() {
struct Process *L = CreateProcess();
// 使用 L
free(L);
}
「一級指針傳值,修改指向無效;二級指針傳址,修改指向生效;或直接返回新指針,簡單又安全。」
| 需求 | 參數類型 | 示例 |
|---|---|---|
| 修改結構體成員 | struct Process *p | p->age = 10; 生效 |
| 修改指針指向 (分配新內存) | struct Process **p | *p = malloc(...); 生效 |
| 僅讀取成員 | const struct Process *p | 防止誤修改 |