以指針作為實參時,實參p傳遞給形參p1的其實是p的拷貝,所以在局部函數中改變形參p1的指向對身處主函數的p是無影響的,但是因為p1是p的拷貝,
所以他們的指向是相同的,所以可以通過p1修改了那塊內存的值。如果實參p的指向為空,也就是說p是一個空指針的話,那么它就沒有指向某塊內存,
形參也就無法操作p所指向的內存了(因為p本就沒有指向任何一塊內存),即使p1在局部函數中指向了一個malloc的空間,
這其實是改變了p1的指向(從NULL到指向malloc的空間),但是如前所述,p1只是p的拷貝,改變副本的指向對本尊是沒有任何影響的,
所以對p沒有影響,p還是為空。但是因為p1的生存周期是在局部函數范圍內,所以一旦函數執行結束,p1這個變量就會被銷毀釋放,
但是那塊malloc的空間卻不會被釋放,那就會成為空間碎片。
實參指針為空的一個例子:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void f(int *p1) 5 { 6 p1 = (int*)malloc(sizeof(int)); 7 *p1 = 100; 8 } 9 10 int main() 11 { 12 int *p = NULL; 13 f(p); 14 printf("%d", *p);//程序崩潰,因為p是空指針,試圖解引用一個空指針 15 return 0; 16 }
實參指針不為空的一個例子:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void f(int *p1) 5 { 6 p1 = (int*)malloc(sizeof(int)); //改變了p1的指向,p1指向新分配的那塊內存,對主函數中的p無任何影響 7 *p1 = 100; 8 } 9 10 int main() 11 { 12 int a = 10; 13 int *p = &a; 14 f(p); 15 printf("%d", *p); //輸出為10 16 return 0; 17 }
傳一個空指針時可以用二級指針
#include <stdio.h> #include <stdlib.h> void f(int **p1) { *p1 = (int*)malloc(sizeof(int)); **p1 = 100; } int main() { int *p = NULL; f(&p); printf("%d", *p);//程序崩潰,因為p是空指針,試圖解引用一個空指針 return 0; }