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

C語言實現野指針的示例代碼

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

一、野指針

1.野指針的概念

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

2.產生原因

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

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

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

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

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

在這里插入圖片描述

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

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i <= 10; i++)
    {
		//當指針指向的范圍超出了數組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) 注意指針越界一個程序向內存申請了哪些空間,通過指針也就只能訪問哪些空間,不能超出范圍訪問,超出了就是越界訪問。
(3) 指針變量不再使用時,及時置為NULL,指針使用之前檢查其有效性當指針變量指向一塊區(qū)域的時候,我們可以通過指針訪問該區(qū)域,后期不再使用這個指針訪問空間的時候,我們可以把該指針置為NULL。因為約定俗成的一個規(guī)則就是∶只要是NULL指針就不去訪問,同時使用指針之前可以判斷指針是否為NULL。
(4) 避免返回局部變量的地址通過上面的例子就可知道,局部變量一旦離開了作用域,就會被銷毀,空間被釋放,此時不能再使用這塊空間的指針來訪問此空間。

二、assert斷言函數

assert() 斷言函數,用于在程序運行過程中捕捉程序的錯誤。在大部分編譯器下,assert()是一個宏;在少數編譯器下,assert就是一個函數。
assert() 函數在程序運行時會對某種假設條件進行檢測,如果條件成立,程序就繼續(xù)往下執(zhí)行,如果條件不成立就會捕捉到這種錯誤,并打印出錯誤信息,終止程序運行。assert()函數包含在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;
}

運行結果:

在這里插入圖片描述

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

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

#define NDEBUG
#include <assert.h>

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

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

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

相關文章

  • C++中空指針訪問成員函數的實現

    C++中空指針訪問成員函數的實現

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

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

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

    基于Qml實現水印工具

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

    C語言入門之基礎知識詳解

    這篇文章主要介紹了C語言入門之基礎知識詳解,文中有非常詳細的C語言使用教程及相關基礎知識,對正在學習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++可變參數模板深入深剖

    C++可變參數模板深入深剖

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

    C++?QT實現獲取本機網卡信息

    這篇文章主要為大家詳細介紹了如何利用qt自帶的QNetworkInterface接口以及c++Iphlpapi庫,獲取當前windows電腦下的網卡信息,需要的可以參考下
    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語言中的浮點數(float,double),并通過實例代碼進行分析比較,希望能幫助學習相關知識的同學
    2016-07-07

最新評論

长乐市| 莱州市| 青浦区| 宣威市| 遵化市| 赤峰市| 卢龙县| 天气| 积石山| 张家港市| 广水市| 措美县| 怀集县| 于都县| 巴林右旗| 河北省| 新竹县| 玉龙| 喜德县| 岱山县| 河间市| 剑阁县| 佳木斯市| 乌什县| 普兰县| 上高县| 唐山市| 封开县| 广宗县| 潼南县| 右玉县| 镇平县| 阿合奇县| 鹤壁市| 海林市| 侯马市| 张家界市| 伊金霍洛旗| 大余县| 思茅市| 荆州市|