内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

如何理解C語(yǔ)言函數(shù)傳參:指針的指針

這篇文章主要介紹“如何理解C語(yǔ)言函數(shù)傳參:指針的指針”,在日常操作中,相信很多人在如何理解C語(yǔ)言函數(shù)傳參:指針的指針問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何理解C語(yǔ)言函數(shù)傳參:指針的指針”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站專(zhuān)注于安寧企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城系統(tǒng)網(wǎng)站開(kāi)發(fā)。安寧網(wǎng)站建設(shè)公司,為安寧等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站開(kāi)發(fā),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

代碼:版本1

void do_malloc(char *p, int size) {     p = (char *)malloc(size + 1);     memset(p, 0, size + 1); }   int main(int argc, char *argv[]) {     char *pData = 0;     do_malloc(pData, 128);     sprintf(pData, "%s", "abc");     printf(pData);     return 0; }

代碼本意是:do_work()函數(shù)向系統(tǒng)堆空間申請(qǐng)size個(gè)字節(jié)的空間,然后返回給main函數(shù)中的pData指針。但是,執(zhí)行的時(shí)候報(bào)錯(cuò):Segmentation  fault (core dumped)。

分析原因

我們可以把char*類(lèi)型的指針看成一個(gè)遙控器,如果給這個(gè)指針賦值,就相當(dāng)于把這個(gè)遙控器與一個(gè)設(shè)備進(jìn)行綁定,可以通過(guò)遙控器來(lái)控制這個(gè)設(shè)備。

執(zhí)行char *pData = 0;

pData內(nèi)容為空,相當(dāng)于這個(gè)遙控器沒(méi)有與任何設(shè)備綁定,如下圖:

如何理解C語(yǔ)言函數(shù)傳參:指針的指針

執(zhí)行do_work(pData, 128);

這里傳遞的參數(shù)是pData本身,所以進(jìn)入void do_work(char *p, int  size)函數(shù)之后,實(shí)參pData的內(nèi)容就賦值給形參p,所以指針p的內(nèi)容也為空,也就是說(shuō):p這個(gè)遙控器也沒(méi)有與任何設(shè)備綁定,如下圖:

如何理解C語(yǔ)言函數(shù)傳參:指針的指針

執(zhí)行p = (char *)malloc(size + 1);

這句話的作用是把申請(qǐng)到的堆空間的首地址,賦值給p。就是說(shuō):現(xiàn)在p指向了內(nèi)存中的一塊空間,就相當(dāng)于一個(gè)p這個(gè)遙控器與一個(gè)設(shè)備進(jìn)行綁定了,可以控制這個(gè)設(shè)備了,如下圖:

如何理解C語(yǔ)言函數(shù)傳參:指針的指針

到這里就已經(jīng)看到程序崩潰的原因了:雖然給指針p賦值了,但是實(shí)參pData中的內(nèi)容一直為空,因此從do_malloc函數(shù)返回之后,pData仍然是一個(gè)空指針,所以就崩潰了。當(dāng)然,p指向的堆空間也就泄露了。

代碼:版本2

代碼的本意是在do_malloc函數(shù)中申請(qǐng)堆空間,然后把這塊空間的首地址賦值給pData。在do_malloc函數(shù)中,調(diào)用系統(tǒng)函數(shù)malloc成功之后返回所分配空間的首地址,關(guān)鍵是要把這個(gè)首地址送給pData指針,也就是說(shuō)要讓pData指針變量中的值等于這個(gè)堆空間的首地址。

那應(yīng)該如何通過(guò)中間的一個(gè)函數(shù)來(lái)完成這個(gè)功能呢,如下代碼:

void do_malloc(char **p, int size) {     *p = (char *)malloc(size + 1);     memset(*p, 0, size + 1); }   int main(int argc, char *argv[]) {     char *pData = 0;     do_malloc(&pData, 128);     sprintf(pData, "%s", "abc");     printf(pData);     return 0; }

執(zhí)行char *pData = 0;

這一句沒(méi)有變化。

執(zhí)行do_malloc(&pData, 128);

把pData指針的地址作為實(shí)參進(jìn)行傳遞,因?yàn)閜Data本身就是一個(gè)指針,加上取地址符&,就是指針的指針(二級(jí)指針),因此do_malloc函數(shù)的第一個(gè)參數(shù)就要定義成char**類(lèi)型,此時(shí)示意如圖:

如何理解C語(yǔ)言函數(shù)傳參:指針的指針

p此時(shí)是一個(gè)二級(jí)指針,參數(shù)賦值之后,p里面的內(nèi)容就變成了pData這個(gè)指針變量的地址,也就是說(shuō)p指向了pData這個(gè)變量。

執(zhí)行*p = (char *)malloc(size + 1);

這句話首先搞明白*p是啥意思,剛才說(shuō)了,p是一個(gè)指針,它指向了pData這個(gè)變量。那么在p前面加上取值操作符*,就相當(dāng)于是取出指針p中的值,它里面的值就是pData!因此,malloc函數(shù)返回的堆空間首地址,就相當(dāng)于是賦值給了pData,如下圖:

如何理解C語(yǔ)言函數(shù)傳參:指針的指針

此時(shí),pData這個(gè)遙控器就與分配的這塊堆空間綁定在一起,隨后再操作pData就沒(méi)有問(wèn)題了。

到此,關(guān)于“如何理解C語(yǔ)言函數(shù)傳參:指針的指針”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

當(dāng)前題目:如何理解C語(yǔ)言函數(shù)傳參:指針的指針
文章URL:http://www.rwnh.cn/article30/ggddso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、面包屑導(dǎo)航網(wǎng)站改版、小程序開(kāi)發(fā)、全網(wǎng)營(yíng)銷(xiāo)推廣云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
咸丰县| 嘉禾县| 健康| 英德市| 红桥区| 洛宁县| 繁峙县| 长汀县| 南和县| 铁力市| 山丹县| 山东| 广安市| 米脂县| 垣曲县| 商河县| 定州市| 皋兰县| 双峰县| 康保县| 定州市| 开阳县| 宝兴县| 鄂托克旗| 绥中县| 汉中市| 屏东市| 洪江市| 通化县| 都兰县| 新干县| 连州市| 盐山县| 日土县| 裕民县| 独山县| 阳谷县| 新巴尔虎右旗| 安宁市| 丰顺县| 舟山市|