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

C語言實現(xiàn)野指針的示例代碼

 更新時間:2024年11月26日 08:48:55   作者:米飯「」  
本文詳細介紹了野指針的概念、產(chǎn)生原因及規(guī)避方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、野指針

1.野指針的概念

指向位置是不可知的、隨機的、不正確的、沒有明確限制的指針就叫野指針。

2.產(chǎn)生原因

野指針產(chǎn)生的原因有:
(1) 指針未初始化
創(chuàng)建指針變量時未對其進行初始化賦值,則這個指針指向的位置是隨機的。

#include<stdio.h>
int main()
{
	int* p;//局部變量指針未初始化,默認為隨機值
	return 0;
}

(2) 指針指向的空間被釋放
①如果一個(局部)變量出了作用域或者是這個變量的生命周期結(jié)束了,那變量就會被銷毀,變量所占的內(nèi)存會還給操作系統(tǒng),此時如果還使用指針訪問該變量,那就會出現(xiàn)野指針,編譯器就會報錯了。

#include<stdio.h>
int* test()
{
	int n = 10;
	return &n;
}
int main()
{
	int* p = test();
	printf("%d\n", *p);
	return 0;
}

②指針被free之后,沒有被置為NULL。對指針進行free只是把指針所指向的空間釋放掉,但并沒有把指針本身置為空,此時指針指向的就是垃圾內(nèi)存,所以釋放后的指針應該立即置為NULL,養(yǎng)成良好的編程習慣,以防產(chǎn)生野指針。

在這里插入圖片描述

(3) 指針越界訪問
在使用指針訪問數(shù)組元素時,超出數(shù)組的范圍,就會造成非法訪問,因為那塊空間不屬于數(shù)組的范圍,就會出現(xiàn)野指針:

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i <= 10; i++)
    {
		//當指針指向的范圍超出了數(shù)組arr的范圍時,p就是野指針 
		*(p++) = i;
	}
	return 0;
}

3.如何規(guī)避野指針

(1) 指針初始化如果明確知道指針指向哪里就直接賦值地址,如果不知道指針應該指向哪里,可以給指針賦值NULL。
NULL是C語言中定義的一個標識符常量,值是0,0也是地址,這個地址是無法使用的,讀寫該地址會報錯。
正確使用指針示例:

#include<stdio.h>
int main()
{
	int num = 10;
	int* p1 = &num;
	int* p2 = NULL;
	return 0;
}

(2) 注意指針越界一個程序向內(nèi)存申請了哪些空間,通過指針也就只能訪問哪些空間,不能超出范圍訪問,超出了就是越界訪問。
(3) 指針變量不再使用時,及時置為NULL,指針使用之前檢查其有效性當指針變量指向一塊區(qū)域的時候,我們可以通過指針訪問該區(qū)域,后期不再使用這個指針訪問空間的時候,我們可以把該指針置為NULL。因為約定俗成的一個規(guī)則就是∶只要是NULL指針就不去訪問,同時使用指針之前可以判斷指針是否為NULL。
(4) 避免返回局部變量的地址通過上面的例子就可知道,局部變量一旦離開了作用域,就會被銷毀,空間被釋放,此時不能再使用這塊空間的指針來訪問此空間。

二、assert斷言函數(shù)

assert() 斷言函數(shù),用于在程序運行過程中捕捉程序的錯誤。在大部分編譯器下,assert()是一個宏;在少數(shù)編譯器下,assert就是一個函數(shù)。
assert() 函數(shù)在程序運行時會對某種假設(shè)條件進行檢測,如果條件成立,程序就繼續(xù)往下執(zhí)行,如果條件不成立就會捕捉到這種錯誤,并打印出錯誤信息,終止程序運行。assert()函數(shù)包含在assert.h這個頭文件中,assert翻譯過來的意思就是“斷言”。所以可以使用assert來判斷指針是否為NULL:

assert(p != NULL);

上面的代碼,在程序運行到這一行語句時,驗證變量p是否等于NULL。如果確實不等于NULL,程序繼續(xù)運行,否則就會終止運行,并且給出報錯信息:

#include<stdio.h>
#include<assert.h>
int main()
{
	int* p = NULL;
	assert(p != NULL);
	return 0;
}

運行結(jié)果:

在這里插入圖片描述

由上圖,assert() 接收一個表達式作為參數(shù)。如果該表達式為真(非零),assert()不會產(chǎn)生任何作用,程序繼續(xù)運行。如果該表達式為假(零),assert()就會報錯,在標準錯誤流stderr中寫入一條錯誤信息,之后顯示沒有通過的表達式,以及包含這個表達式的文件名行號。關(guān)于的概念,后面會學習。

使用 assert() 的好處:
assert() 不僅能自動標識文件和出問題的行號,而且它還具備一種無需更改代碼就能開啟或關(guān)閉的機制:如果已經(jīng)確認程序沒有問題,不需要再做斷言,就在 #include <assert.h> 語句的前面,定義一個宏NDEBUG,它的意思是No Debug(一旦定義了宏NDEBUG,assert() 就會失效):

#define NDEBUG
#include <assert.h>

然后,重新編譯程序,編譯器就會禁用文件中所有的 assert() 語句。如果程序又出現(xiàn)問題,可以移除這條 #define NDEBUG 指令(或者把它注釋掉),再次編譯,這樣就重新啟用了 assert() 語句。

assert() 的缺點:
assert() 的缺點是:因為引入了額外的檢查,增加了程序的運行時間。
一般我們在Debug調(diào)試版本中使用assert,而在Release發(fā)行版本中選擇禁用assert。在VS這樣的集成開發(fā)環(huán)境中,在Release版本中,assert直接就被優(yōu)化掉了。這樣在Debug版本中使用assert有利于程序員排查問題,而在Release版本中不影響用戶使用程序時的效率。

到此這篇關(guān)于C語言實現(xiàn)野指針的示例代碼的文章就介紹到這了,更多相關(guān)C語言 野指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中空指針訪問成員函數(shù)的實現(xiàn)

    C++中空指針訪問成員函數(shù)的實現(xiàn)

    本文主要介紹了C++中空指針訪問成員函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-02-02
  • C++定制刪除器與特殊類設(shè)計(餓漢和懶漢)

    C++定制刪除器與特殊類設(shè)計(餓漢和懶漢)

    這篇文章主要給大家介紹了關(guān)于C++定制刪除器與特殊類設(shè)計的相關(guān)資料,使用餓漢模式和懶漢模式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 基于Qml實現(xiàn)水印工具

    基于Qml實現(xiàn)水印工具

    這篇文章主要介紹了如何在?Qml?中實現(xiàn)一個簡單但功能強大的水印工具,包括水印文本的透明度、顏色、字體大小、旋轉(zhuǎn)角度等自定義功能,需要的可以參考下
    2024-12-12
  • C語言入門之基礎(chǔ)知識詳解

    C語言入門之基礎(chǔ)知識詳解

    這篇文章主要介紹了C語言入門之基礎(chǔ)知識詳解,文中有非常詳細的C語言使用教程及相關(guān)基礎(chǔ)知識,對正在學習c語言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 編輯器寫C語言輸出中文亂碼問題及解決

    編輯器寫C語言輸出中文亂碼問題及解決

    這篇文章主要介紹了編輯器寫C語言輸出中文亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • C語言算法積累加tag的循環(huán)隊列

    C語言算法積累加tag的循環(huán)隊列

    這篇文章主要為大家介紹了C語言算法積累加tag的循環(huán)隊列的解題思路,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • C++可變參數(shù)模板深入深剖

    C++可變參數(shù)模板深入深剖

    個可變參數(shù)模板(variadic template)就是一個接受可變數(shù)目參數(shù)的函數(shù)模板或類模板,下面這篇文章主要給大家介紹了關(guān)于C++可變參數(shù)模板的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • C++?QT實現(xiàn)獲取本機網(wǎng)卡信息

    C++?QT實現(xiàn)獲取本機網(wǎng)卡信息

    這篇文章主要為大家詳細介紹了如何利用qt自帶的QNetworkInterface接口以及c++Iphlpapi庫,獲取當前windows電腦下的網(wǎng)卡信息,需要的可以參考下
    2024-01-01
  • C++語義copy and swap示例詳解

    C++語義copy and swap示例詳解

    這篇文章主要為大家介紹了C++語義copy and swap示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • C語言double和float 實例分析

    C語言double和float 實例分析

    本文主要介紹了C語言中的浮點數(shù)(float,double),并通過實例代碼進行分析比較,希望能幫助學習相關(guān)知識的同學
    2016-07-07

最新評論

汉中市| 彭山县| 巴楚县| 洱源县| 临澧县| 五家渠市| 达日县| 临夏县| 香格里拉县| 佳木斯市| 银川市| 青海省| 深水埗区| 东光县| 永清县| 汉阴县| 奉节县| 嘉祥县| 威海市| 胶南市| 安泽县| 新晃| 巫溪县| 嵊州市| 尉犁县| 鱼台县| 磴口县| 玉溪市| 昔阳县| 双柏县| 江山市| 云南省| 博爱县| 浮山县| 海阳市| 临武县| 眉山市| 琼中| 诸暨市| 垫江县| 久治县|