C程序中可怕的野指針

1、疑問點
指針是C語言一個很強大的功能,同時也是很容易讓人犯錯的一個功能,用錯了指針,輕者只是報個錯,重者可能整個系統都崩潰了。下面是你們在編寫C程序時,常常遇到的一種錯誤的使用方法,也許在你的學習和工做中就是這樣用的,很危險。實例程序如圖1所示:

安全

圖1 實例程序
這段程序比較簡單,str1指向的內存區域存放了一個字符串「123」,把「123」賦值到str2指向的內存區域,編譯時會給出一個告警:
local variable 'str2' used without having been initialized
意思是說,「str2」這個變量沒有初始化。咱們能夠不理會這個告警,而且繼續運行程
序,可是「str2」在定義時沒有給初值,是一個野指針,程序運行的結果多是很是可怕的。下面咱們來詳細分析下,野指針的可怕之處。

2、可怕的野指針
咱們程序中的
strcpy(str2 , str1);
printf("str2指向的字符串是 %s",str2);
這兩行代碼註釋掉,而後運行程序,看看str2輸出的值是多少。
運行結果以下:
可見str2被系統賦予一個值3435973836,3435973836是一個內存的地址,也就是指針str2指向這段內存,這段內存上保存的數據多是其餘某個程序的數據,例如保存着「hello world!」,如圖2所示,也可能什麼數據也沒有。

函數

圖2 其餘程序的重要數據

若是這段內存保存着其餘程序的重要數據,經過strcopy函數將「123」複製給了這段內存,也就是修改了這個重要數據,這段內存保存的數據變成了「123lo world!」,如圖3所示,那麼其餘程序可能就崩掉了!

圖3 其餘程序的重要數據被改寫

3、避免野指針的方法
爲了防止野指針帶來的災難,建議指針在定義時給一個初值,好比「NULL」,意思是不指向任何內存地址。而後再使用malloc函數給指針分配一塊存儲空間。修改的程序如圖4所示:

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

在定義str2時賦予初值「NULL」,這樣str2就不會指向任何內存。再經過malloc函數,申請一段空的內存區域,也就是沒有任何程序使用的內存區域,讓str2指向這段空的內存區域,如圖5所示,此時再把「123」賦值到這段空的內存區域,這樣就安全了。程序的最後,再主動釋放掉這段內存區域,讓str2再次不指向任何區域。

圖5 系統分配的內存區域

運行結果如圖6所示:

圖6 運行結果

由結果可見,系統分配的沒有任何其餘程序使用的內存地址是「2428680」。學習

相關文章
相關標籤/搜索