欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、疑問點

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

實例程序如圖1所示:

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

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

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

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

三、避免野指針的方法

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

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

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

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

運行結果如圖6所示:

圖6 運行結果

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

總結

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

相關文章

  • C++實現(xiàn)迷宮小游戲

    C++實現(xiàn)迷宮小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)迷宮小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 講解C語言編程中指針賦值的入門實例

    講解C語言編程中指針賦值的入門實例

    這篇文章主要介紹了講解C語言編程中指針賦值的入門實例,通過const int i與int *const pi這樣兩個例子來分析指針的賦值和地址指向,需要的朋友可以參考下
    2015-12-12
  • C++ 實現(xiàn)高性能HTTP客戶端

    C++ 實現(xiàn)高性能HTTP客戶端

    HttpClient可以實現(xiàn)所有HTTP的方法,通過API傳輸接收HTTP消息。本文詳細講解了HttpClient,以及如何運用C++實現(xiàn)HTTP客戶端,感興趣的朋友可以參考一下
    2021-08-08
  • C語言如何實現(xiàn)BOOL類型

    C語言如何實現(xiàn)BOOL類型

    這篇文章主要介紹了C語言如何實現(xiàn)BOOL類型問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言中字符型數(shù)據(jù)和浮點型數(shù)據(jù)介紹

    C語言中字符型數(shù)據(jù)和浮點型數(shù)據(jù)介紹

    大家好,本篇文章主要講的是C語言中字符型數(shù)據(jù)和浮點型數(shù)據(jù)介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 詳解C語言在STM32中的內存分配問題

    詳解C語言在STM32中的內存分配問題

    這篇文章主要介紹了C語言在STM32中的內存分配,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C++解決大數(shù)組棧內存不夠問題的方法分析

    C++解決大數(shù)組棧內存不夠問題的方法分析

    這篇文章主要介紹了C++解決大數(shù)組棧內存不夠問題的方法,結合實例形式對比分析了C++針對大數(shù)組棧內存不足情況的常見解決方法及其優(yōu)缺點,具有一定參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • C++中需要注意的細節(jié)你知道嗎

    C++中需要注意的細節(jié)你知道嗎

    這篇文章主要介紹了C++ 需要注意的幾點細節(jié),幫助大家更好的理解和學習C++,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-09-09
  • C++中用substr()函數(shù)消除前后空格的解決方法詳解

    C++中用substr()函數(shù)消除前后空格的解決方法詳解

    本篇文章是對C++中用substr()函數(shù)消除前后空格的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++求Fib數(shù)列

    C++求Fib數(shù)列

    本文給大家匯總介紹了幾種C++求Fib數(shù)列的方法,有需要的小伙伴們可以來參考下
    2016-02-02

最新評論