亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1302 | 回復: 8
打印 上一主題 下一主題

關(guān)于指針--求解。 謝謝! [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2006-04-29 16:57 |只看該作者 |倒序瀏覽
指針參數(shù)是如何傳遞內(nèi)存的?
如果函數(shù)的參數(shù)是一個指針,不要指望用該指針去申請動態(tài)內(nèi)存。示例7-4-1中,Test函數(shù)的語句GetMemory(str, 200)并沒有使str獲得期望的
內(nèi)存,str依舊是NULL,為什么?


void GetMemory(char *p, int num)

{

p = (char *)malloc(sizeof(char) * num);

}

void Test(void)

{

char *str = NULL;

GetMemory(str, 100); // str 仍然為 NULL

strcpy(str, "hello"); // 運行錯誤

}


示例7-4-1 試圖用指針參數(shù)申請動態(tài)內(nèi)存


毛病出在函數(shù)GetMemory中。編譯器總是要為函數(shù)的每個參數(shù)制作臨時副本,指針參數(shù)p的副本是 _p,編譯器使 _p = p。如果函數(shù)體內(nèi)的程序
修改了_p的內(nèi)容,就導致參數(shù)p的內(nèi)容作相應(yīng)的修改。這就是指針可以用作輸出參數(shù)的原因。在本例中,_p申請了新的內(nèi)存,只是把_p所指的內(nèi)
存地址改變了,但是p絲毫未變。所以函數(shù)GetMemory并不能輸出任何東西。事實上,每執(zhí)行一次GetMemory就會泄露一塊內(nèi)存,因為沒有用free
釋放內(nèi)存。

如果非得要用指針參數(shù)去申請內(nèi)存,那么應(yīng)該改用“指向指針的指針”,見示例7-4-2。


void GetMemory2(char **p, int num)

{

*p = (char *)malloc(sizeof(char) * num);

}

void Test2(void)

{

char *str = NULL;

GetMemory2(&str, 100); // 注意參數(shù)是 &str,而不是str

strcpy(str, "hello");

cout<< str << endl;

free(str);

}


示例7-4-2用指向指針的指針申請動態(tài)內(nèi)存


由于“指向指針的指針”這個概念不容易理解,我們可以用函數(shù)返回值來傳遞動態(tài)內(nèi)存。這種方法更加簡單,
==================

不明白 GetMemory2 就可以了呢?
我認為一樣的結(jié)果呀,那位給解惑呀。  謝謝。!

[ 本帖最后由 laosui 于 2006-4-29 17:09 編輯 ]

論壇徽章:
0
2 [報告]
發(fā)表于 2006-04-29 16:57 |只看該作者
這是關(guān)于  高質(zhì)量C   中的一段。  謝謝。

論壇徽章:
0
3 [報告]
發(fā)表于 2006-04-29 17:04 |只看該作者
因為參數(shù)是一個指針,他不存放任何值,也沒有空間存放任何值
所以動態(tài)分配的內(nèi)存指針不能給它,我是這樣理解的!

論壇徽章:
0
4 [報告]
發(fā)表于 2006-04-29 17:07 |只看該作者
還是不能理解。 。。。

論壇徽章:
0
5 [報告]
發(fā)表于 2006-04-29 17:16 |只看該作者
搞不定, 幫忙呀。。。。。

論壇徽章:
0
6 [報告]
發(fā)表于 2006-04-29 17:18 |只看該作者
void GetMemory(char *p, int num) ;
函數(shù)自動為p建一個臨時變量,這時的P和Test里的P不是一個
就是說,這里的地址*p不是TEST里的*p,申請的空間和Test里的*P沒關(guān)系.

void GetMemory2(char **p, int num) ;
這里的p和Test2里的p不是一個,但是值相同,所以*p是同一個地址

不知道說明白了沒有

我也是菜鳥

論壇徽章:
0
7 [報告]
發(fā)表于 2006-04-29 17:30 |只看該作者
在void GetMemory(char *p, int num)中,賦值是這樣進行的:
     *p=str;//讓p和str指向同一地址
     p = (char *)malloc(sizeof(char) * num); //讓p又去指向另一塊地址。

搞來搞去,str沒有變,都是p在折騰,而且在最后返回的時候還被釋放了。

而在void GetMemory2(char **p, int num)中:

     **p=&str;//也就是*p=str。
     *P=str=(char *)malloc(sizeof(char) * num);//讓str指向malloc地址。

OK?

[ 本帖最后由 sealdad 于 2006-4-29 17:43 編輯 ]

論壇徽章:
0
8 [報告]
發(fā)表于 2006-04-29 17:37 |只看該作者
就是由於傳的是值不是指針(指針也是值),應(yīng)該做過那個實現(xiàn)一個函數(shù)交換a,b的值的問題吧,仔細想想就明白了,實在不行就畫個圖.
也可以這樣:
char* GetMemory(char *p, int num)

{

p = (char *)malloc(sizeof(char) * num);

return p;
}

void Test(void)

{

char *str = NULL;

str=GetMemory(str, 100);

strcpy(str, "hello");

}

論壇徽章:
0
9 [報告]
發(fā)表于 2006-04-30 08:53 |只看該作者
6 樓說的好像有道理。 但是。。。。。。。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP