最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C程序中可怕的野指針圖文詳解

 更新時間:2019年07月18日 09:10:29   作者:石家的魚  
這篇文章主要給大家介紹了關(guān)于C程序中可怕的野指針的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C程序具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

一、疑問點

指針是C語言一個很強(qiáng)大的功能,同時也是很容易讓人犯錯的一個功能,用錯了指針,輕者只是報個錯,重者可能整個系統(tǒng)都崩潰了。下面是大家在編寫C程序時,經(jīng)常遇到的一種錯誤的使用方法,也許在你的學(xué)習(xí)和工作中就是這樣用的,很危險。

實例程序如圖1所示:

圖1 實例程序

這段程序比較簡單,str1指向的內(nèi)存區(qū)域存放了一個字符串“123”,把“123”賦值到str2指向的內(nèi)存區(qū)域,編譯時會給出一個告警:

local variable 'str2' used without having been initialized

意思是說,“str2”這個變量沒有初始化。我們可以不理會這個告警,并且繼續(xù)運(yùn)行程

序,但是“str2”在定義時沒有給初值,是一個野指針,程序運(yùn)行的結(jié)果可能是非常可怕的。下面我們來詳細(xì)分析下,野指針的可怕之處。

二、可怕的野指針

我們程序中的

strcpy(str2 , str1);
printf("str2指向的字符串是 %s",str2);

這兩行代碼注釋掉,然后運(yùn)行程序,看看str2輸出的值是多少。

運(yùn)行結(jié)果如下:

可見str2被系統(tǒng)賦予一個值3435973836,3435973836是一個內(nèi)存的地址,也就是指針str2指向這段內(nèi)存,這段內(nèi)存上保存的數(shù)據(jù)可能是其他某個程序的數(shù)據(jù),例如保存著“hello world!”,如圖2所示,也可能什么數(shù)據(jù)也沒有。

圖2 其他程序的重要數(shù)據(jù)

如果這段內(nèi)存保存著其他程序的重要數(shù)據(jù),通過strcopy函數(shù)將“123”復(fù)制給了這段內(nèi)存,也就是修改了這個重要數(shù)據(jù),這段內(nèi)存保存的數(shù)據(jù)變成了“123lo world!”,如圖3所示,那么其他程序可能就崩掉了!

圖3 其他程序的重要數(shù)據(jù)被改寫

三、避免野指針的方法

為了防止野指針帶來的災(zāi)難,建議指針在定義時給一個初值,比如“NULL”,意思是不指向任何內(nèi)存地址。然后再使用malloc函數(shù)給指針分配一塊存儲空間。修改的程序如圖4所示:

圖4 避免野指針的改法程序

在定義str2時賦予初值“NULL”,這樣str2就不會指向任何內(nèi)存。再通過malloc函數(shù),申請一段空的內(nèi)存區(qū)域,也就是沒有任何程序使用的內(nèi)存區(qū)域,讓str2指向這段空的內(nèi)存區(qū)域,如圖5所示,此時再把“123”賦值到這段空的內(nèi)存區(qū)域,這樣就安全了。程序的最后,再主動釋放掉這段內(nèi)存區(qū)域,讓str2再次不指向任何區(qū)域。

圖5 系統(tǒng)分配的內(nèi)存區(qū)域

運(yùn)行結(jié)果如圖6所示:

圖6 運(yùn)行結(jié)果

由結(jié)果可見,系統(tǒng)分配的沒有任何其他程序使用的內(nèi)存地址是“2428680”。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

吴江市| 尖扎县| 望城县| 玉林市| 吕梁市| 迭部县| 山西省| 金门县| 三亚市| 莎车县| 正宁县| 紫云| 三门县| 衢州市| 郑州市| 安化县| 怀集县| 益阳市| 井研县| 蕉岭县| 定襄县| 汽车| 和政县| 滨州市| 政和县| 正蓝旗| 凭祥市| 南召县| 商水县| 彩票| 九龙县| 东山县| 元阳县| 正安县| 樟树市| 保德县| 古田县| 伊吾县| 岳池县| 杨浦区| 崇信县|