二級指標做形參機制總結

jamescodd發表於2009-01-04

本文對C 二級指標做形參的機制做了總結.

[@more@]

很多 C programmer 對二級指標做形參比較困惑:

關於此,本人總結:

1 核心是地址和內容,要嚴格區分. 二級指標做形參更多用來完成兩個地址空間(二個程式或二個DLL)之間的地址傳遞. 高階程式如Apache 多用這種方法來完成地址的傳遞.

2 <wbr>實參和形參的地址空間是單獨分配的.但形參的地址可以指向實參,在函式呼叫期間可以把獲得的地址反向傳遞給實參.

3 <wbr>實參向形參傳遞引數核心都是"值"複製! 即 取一級引用內容. 看壓棧的值是普通變數、<wbr><wbr>一級指標、<wbr>二級指標.

重點符號: <wbr>char * str; 那麼三要素是 &str(自身地址) <wbr><wbr>str(間接地址) <wbr><wbr>*str(間接引用) 要嚴格區分.

如果對彙編知識瞭解點,就好理解了.

看我做的測試例子:

<wbr>

#include
#include
#include
void GetMemory(char *p, int num)
{
printf("pre-0x%xn",&p);
printf("pre-0x%xn",p);
p = (char *)malloc(sizeof(char) * num);
printf("after-0x%xn",&p);
printf("after-0x%xn",p);
}
void Test(void) //此函式產生記憶體洩露
{
char *str = NULL;
printf("caller-0x%xn",&str);
GetMemory(str, 100); // str 仍然為 NULL
printf("caller-0x%xn",&str);
if(str!=NULL)
strcpy(str, "hello"); // 執行錯誤
}
void GetMemory2(char **p, int num)
{
printf("before(&p)-0x%xn",&p);
printf("before(p)-0x%xn",p);
printf("before(*p)-0x%xn",*p);
*p = (char *)malloc(sizeof(char) * num);
printf("after(&p)-0x%xn",&p);
printf("after(p)-0x%xn",p);
printf("after(*p)-0x%xn",*p);

}
void testinter(int **m)

{
printf("in stack=0x%xn",&m);
printf("in stack=0x%xn",m);
*m=(int*)malloc(sizeof(int));
**m=3;
}

void Test3(void)
{

int *p2=NULL;

testinter(&p2);

printf("after=0x%xn",&p2);
printf("after=0x%xn",p2);
printf("after=%dn",*p2);

}
void Test2(void)
{

char *str = NULL;
printf("caller(&str)-0x%xn",&str);
GetMemory2(&str, 100); // 注意引數是 &str,而不是str
printf("caller(&str)-0x%xn",&str);
printf("caller(str)-0x%xn",str);
if(str!=NULL)strcpy(str, "hello ok!!!!!n");
printf("%s",str);
free(str);
}
void main()
{

//分別測試.
//Test();
Test2();
//Test3();
}

執行結果:Test3:

----------------------------

in stack=0x13fed8
in stack=0x13ff28
after=0x13ff28
after=0x30fe0
after=3
------------------------------

Test2:

caller(&str)-0x13ff28
before(&p)-0x13fed4
before(p)-0x13ff28
before(*p)-0x0
after(&p)-0x13fed4
after(p)-0x13ff28
after(*p)-0x30fe0
caller(&str)-0x13ff28
caller(str)-0x30fe0
hello ok!!!!!
-----------------------------------

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/784596/viewspace-1015634/,如需轉載,請註明出處,否則將追究法律責任。

相關文章