溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C程序中可怕的野指針

發(fā)布時間:2020-06-28 09:15:57 來源:網(wǎng)絡(luò) 閱讀:324 作者:kelehaier 欄目:編程語言

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

圖1 實例程序
這段程序比較簡單,str1指向的內(nèi)存區(qū)域存放了一個字符串“123”,把“123”賦值到str2指向的內(nèi)存區(qū)域,編譯時會給出一個告警:
local variable 'str2' used without having been initialized
意思是說,“str2”這個變量沒有初始化。我們可以不理會這個告警,并且繼續(xù)運行程
序,但是“str2”在定義時沒有給初值,是一個野指針,程序運行的結(jié)果可能是非??膳碌?。下面我們來詳細(xì)分析下,野指針的可怕之處。

二、可怕的野指針
我們程序中的
strcpy(str2 , str1);
printf("str2指向的字符串是 %s",str2);
這兩行代碼注釋掉,然后運行程序,看看str2輸出的值是多少。
運行結(jié)果如下:
C程序中可怕的野指針
可見str2被系統(tǒng)賦予一個值3435973836,3435973836是一個內(nèi)存的地址,也就是指針str2指向這段內(nèi)存,這段內(nèi)存上保存的數(shù)據(jù)可能是其他某個程序的數(shù)據(jù),例如保存著“hello world!”,如圖2所示,也可能什么數(shù)據(jù)也沒有。
C程序中可怕的野指針

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

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

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

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

圖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ū)域。

C程序中可怕的野指針
圖5 系統(tǒng)分配的內(nèi)存區(qū)域

運行結(jié)果如圖6所示:
C程序中可怕的野指針

圖6 運行結(jié)果

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI