版權聲明:本文為作者原創(chuàng)文章术吗,轉載時請注明文章來源,否則視為侵權帆精,并按法律程序處理较屿!
一、疑問點
指針是C語言一個很強大的功能卓练,同時也是很容易讓人犯錯的一個功能隘蝎,用錯了指針,輕者只是報個錯襟企,重者可能整個系統都崩潰了嘱么。下面是大家在編寫C程序時,經常遇到的一種錯誤的使用方法顽悼,也許在你的學習和工作中就是這樣用的曼振,很危險。實例程序如圖1所示:
這段程序比較簡單蔚龙,str1指向的內存區(qū)域存放了一個字符串“123”冰评,把“123”賦值到str2指向的內存區(qū)域,編譯時會給出一個告警:
local variable 'str2' used without having been initialized
意思是說木羹,“str2”這個變量沒有初始化甲雅。我們可以不理會這個告警解孙,并且繼續(xù)運行程
序,但是“str2”在定義時沒有給初值抛人,是一個野指針弛姜,程序運行的結果可能是非常可怕的妖枚。下面我們來詳細分析下廷臼,野指針的可怕之處。
二盅惜、可怕的野指針
我們程序中的
strcpy(str2 , str1);
printf("str2指向的字符串是 %s",str2);
這兩行代碼注釋掉中剩,然后運行程序,看看str2輸出的值是多少抒寂。
運行結果如下:
可見str2被系統賦予一個值3435973836结啼,3435973836是一個內存的地址,也就是指針str2指向這段內存屈芜,這段內存上保存的數據可能是其他某個程序的數據郊愧,例如保存著“hello world!”,如圖2所示井佑,也可能什么數據也沒有属铁。
如果這段內存保存著其他程序的重要數據,通過strcopy函數將“123”復制給了這段內存躬翁,也就是修改了這個重要數據焦蘑,這段內存保存的數據變成了“123lo world!”,如圖3所示盒发,那么其他程序可能就崩掉了例嘱!
三、避免野指針的方法
為了防止野指針帶來的災難宁舰,建議指針在定義時給一個初值拼卵,比如“NULL”,意思是不指向任何內存地址蛮艰。然后再使用malloc函數給指針分配一塊存儲空間腋腮。修改的程序如圖4所示:
在定義str2時賦予初值“NULL”,這樣str2就不會指向任何內存壤蚜。再通過malloc函數即寡,申請一段空的內存區(qū)域,也就是沒有任何程序使用的內存區(qū)域袜刷,讓str2指向這段空的內存區(qū)域嘿悬,如圖5所示,此時再把“123”賦值到這段空的內存區(qū)域水泉,這樣就安全了。程序的最后,再主動釋放掉這段內存區(qū)域草则,讓str2再次不指向任何區(qū)域钢拧。
運行結果如圖6所示:
由結果可見,系統分配的沒有任何其他程序使用的內存地址是“2428680”炕横。