先看一個例子:這個程序為什么會崩潰?
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int f(int *q) 5 { 6 int a = 10; 7 q = (int*)malloc(sizeof(int)); 8 *q = a; 9 return 0; 10 } 11 12 int main() 13 { 14 15 int *p = NULL; 16 f(p); 17 printf("%d", *p); 18 return 0; 19 }
此處的q任然是p的一個拷貝,可以通過這個程序證明:
1 #include <iostream> 2 3 4 int f(int *q) 5 { 6 std::cout << &q << std::endl; 7 return 0; 8 } 9 10 int main() 11 { 12 int a = 10; 13 int *p = &a; 14 f(p); 15 std::cout << &p; 16 return 0; 17 }
輸出為: , 說明指針p與指針q的地址是不同的,證明q是p的一個拷貝。
所以第一個程序崩潰的原因:函數中的q
其實是實參p的一份拷貝,函數中的操作都是對q進行的,p仍然是NULL,所以輸出*p的值產生崩潰!
可以把形參改為二級指針,程序便可以按預想中的情形進行:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int f(int **q) 5 { 6 int a = 10; 7 *q = (int*)malloc(sizeof(int)); 8 **q = a; 9 return 0; 10 } 11 12 int main() 13 { 14 15 int *p = NULL; 16 f(&p); 17 printf("%d", *p); 18 return 0; 19 }