欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C/C++返回內(nèi)部靜態(tài)成員的陷阱有哪些

這篇文章主要介紹“C/C++返回內(nèi)部靜態(tài)成員的陷阱有哪些”,在日常操作中,相信很多人在C/C++返回內(nèi)部靜態(tài)成員的陷阱有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C/C++返回內(nèi)部靜態(tài)成員的陷阱有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、百色ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的百色網(wǎng)站制作公司

在我們用C/C++開發(fā)的過程中,總是有一個問題會給我們帶來苦惱。這個問題就是函數(shù)內(nèi)和函數(shù)外代碼需要通過一塊內(nèi)存來交互(比如,函數(shù)返回字符串),這個問題困擾和很多開發(fā)人員。如果你的內(nèi)存是在函數(shù)內(nèi)棧上分配的,那么這個內(nèi)存會隨著函數(shù)的返回而被彈棧釋放,所以,你一定要返回一塊函數(shù)外部還有效的內(nèi)存。

這是一個讓無數(shù)人困擾的問題。如果你一不小心,你就很有可能在這個上面犯錯誤。當然目前有很多解決方法,如果你熟悉一些標準庫的話,你可以看到許多各式各樣的解決方法。大體來說有下面幾種:

1)在函數(shù)內(nèi)部通過malloc或new在堆上分配內(nèi)存,然后把這塊內(nèi)存返回(因為在堆上分配的內(nèi)存是全局可見的)。這樣帶來的問題就是潛在的內(nèi)存問題。

因為,如果返回出去的內(nèi)存不釋放,那么就是memory Leak?;蛘呤潜欢啻吾尫?,從而造成程序的crash。這兩個問題都相當?shù)膰乐?,所以這種設(shè)計方法并不推薦。(在一些Windows API中,當你調(diào)用了一些API后,你必需也要調(diào)用他的某些API來釋放這塊內(nèi)存)

2)讓用戶傳入一塊他自己的內(nèi)存地址,而在函數(shù)中把要返回的內(nèi)存放到這塊內(nèi)存中。這是一個目前普遍使用的方式。很多Windows API函數(shù)或是標準C函數(shù)都需要你傳入一個buffer和這個buffer的長度。這種方式對我們來說應(yīng)該是屢見不鮮了。這種方式的好處就是由函數(shù)外部的程序來維護這塊內(nèi)存,比較簡顯直觀。但問題就是在使用上稍許有些麻煩。不過這種方式把犯錯誤的機率減到了***。

3)第三種方式顯得比較另類,他利用了static的特性,static的棧內(nèi)存一旦分配,那這塊內(nèi)存不會隨著函數(shù)的返回而釋放,而且,它是全局可見的(只要你有這塊內(nèi)存的地址)。所以,有一些函數(shù)使用了static的這個特性,即不用使用堆上的內(nèi)存,也不需要用戶傳入一個buffer和其長度。從而,使用得自己的函數(shù)長得很漂亮,也很容易使用。

這里,我想對第三個方法進行一些討論。使用static內(nèi)存這個方法看似不錯,但是它有讓你想象不到的陷阱。讓我們來用一個實際發(fā)生的案例來舉一個例子吧。

示例

有過socket編程經(jīng)驗的人一定知道一個函數(shù)叫:inet_ntoa,這個函數(shù)主要的功能是把一個數(shù)字型的IP地址轉(zhuǎn)成字符串,這個函數(shù)的定義是這樣的(注意它的返回值):

char *inet_ntoa(struct in_addr in);

顯然,這個函數(shù)不會分配堆上的內(nèi)存,而他又沒有讓你傳一下字符串的buffer進入,那么他一定使用“返回static char[]”這種方法。在我們繼續(xù)我們的討論之前,讓我們先了解一下IP地址相關(guān)的知識,下面是inet_ntoa這個函數(shù)需要傳入的參數(shù):(也許你會很奇怪,只有一個member的struct還要放在struct中干什么?這應(yīng)該是為了程序日后的擴展性的考慮)

struct in_addr {  unsigned long int s_addr;  }

對于IPV4來說,一個IP地址由四個8位的bit組成,其放在s_addr中,高位在后,這是為了方便網(wǎng)絡(luò)傳輸。如果你得到的一個s_addr的整型值是:3776385196。那么,打開你的Windows計算器吧,看看它的二進制是什么?讓我們從右到左,8位為一組(如下所示)。

11100001 00010111 00010000 10101100

再把每一組轉(zhuǎn)成十進制,于是我們就得到:225 23 16 172, 于是IP地址就是 172.16.23.225。

好了,言歸正傳。我們有這樣一個程序,想記錄網(wǎng)絡(luò)包的源地址和目地地址,于是,我們有如下的代碼:

struct in_addr src, des;  ........  ........  fprintf(fp, "源IP地址<%s>\t 目的IP地址<%s>\n", inet_ntoa(src), inet_ntoa(des));

會發(fā)生什么樣的結(jié)果呢?你會發(fā)現(xiàn)記錄到文件中的源IP地址和目的IP地址完全一樣。這是什么問題呢?于是你開始調(diào)試你的程序,你發(fā)現(xiàn)src.s_addr和des.s_addr根本不一樣(如下所示)。可為什么輸出到文件的源和目的都是一樣的?難道說是inet_ntoa的bug?

src.s_addr = 3776385196; //對應(yīng)于172.16.23.225  des.s_addr = 1678184620; //對應(yīng)于172.16.7.100

原因就是inet_ntoa()“自作聰明”地把內(nèi)部的static char[]返回了,而我們的程序正是踩中了這個陷阱。讓我們來分析一下fprintf代碼。在我們fprintf時,編譯器先計算inet_ntoa(des),于是其返回一個字符串的地址,然后程序再去求inet_ntoa(src)表達式,又得到一個字符串的地址。

這兩個字符串的地址都是inet_ntoa()中那個static char[],顯然是同一個地址,而第二次求src的IP時,這個值的des的IP地址內(nèi)容必將被src的IP覆蓋。所以,這兩個表達式的字符串內(nèi)存都是一樣的了,此時,程序會調(diào)用fprintf把這兩個字符串(其實是一個)輸出到文件。所以,得到相同的結(jié)果也就不奇怪。

仔細看一下inet_ntoa的man,我們可以看到這句話:The string is returned in a statically allocated buffer, which subsequent calls will overwrite. 證實了我們的分析。

到此,關(guān)于“C/C++返回內(nèi)部靜態(tài)成員的陷阱有哪些”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)站標題:C/C++返回內(nèi)部靜態(tài)成員的陷阱有哪些
本文來源:http://aaarwkj.com/article32/jeehsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、App開發(fā)網(wǎng)站設(shè)計公司、軟件開發(fā)、品牌網(wǎng)站建設(shè)

廣告

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

微信小程序開發(fā)
夫妻性生活免费的视频| 中文字幕精品一区二区三区精品| 亚洲最新一区二区在线观看| 国内精品一区二区欧美| 在线高清视频无卡不码| 亚洲一区二区精品自拍| 青青久久精品国产亚洲av| 91国产精品视频在线| 欧美三级精品三级在线| 日韩av在线播放亚洲天堂| 日韩三级黄片在线观看| 亚洲禁看av一区不卡| 四虎最新永久在线网站| 高潮国产精品一区二区| 婷婷色爱区综合五月激情 | 青青草成人免费在线公开视频| 日本一区二区三区久久久| 午夜两性做爰免费视频| 亚洲av网站一区二区三区| 精品人妻在线中文字幕| 国产精品亚洲视频欧美视频| 人妻口爆视频一区二区三区| 色噜噜噜av天堂九区| 超碰在线免费视频97| 亚洲国产第一尤物视频| 欧美av在线免费观看| 我要看亚洲黄色片一级 | 中文字幕乱码日韩在线| 日韩av亚洲在线观看| 亚洲国产精品一区二区av不卡| 亚洲熟妇av乱码在线| 一区二区三区日韩欧美在线| 色悠悠粉嫩一区二区三区| 日本韩国国语对白一区二区三区 | 成人高清在线观看91| 久久综合婷婷亚洲五月| 中文字幕日韩有码在线| 亚洲三级黄色在线观看| 日本一区二区三区伦理| 欧美日韩中文国产天堂| 日韩天堂视频在线播放|