以指針作為實參的問題


以指針作為實參時,實參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;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM