日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言野指针分析

發布時間:2023/12/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言野指针分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.?野指針的概念? ?? ?? ??? ?? ??

所謂的野指針,就是說指針指向的那塊內存,你沒有合法操作的權限,也就是指針指向非法的內存空間,這樣的指針就叫做野指針。


2.?野指針產生的原因

(1)?指針變量未初始化 ? ?? ???

任何指針變量剛被創建時不會被自動置為NULL,它的缺省值是隨機的,所以這塊內存,所以指針變量在創建時,要么初始化讓它指向一塊合法的內存,要么置為NULL。


#include <stdio.h> #include <stdlib.h>int main(void) {//int *p; //指針變量沒有被初始化,值是隨機的int a = 3;//int *p = NULL; //初始化時將指針置為空//int *p = &a; //初始化時將指針指向aprintf("%d", p); return 0; }


(2)?指針指向的內存釋放后之后未置空 ? ?? ???

指針指向的內存被free或者delete釋放后,指針的值仍然為剛剛被釋放的那塊內存的首地址,但是此時指針已經失去了對那塊內存的合法訪問權限,所以在free或delete一塊內存后,要及時把指針置為NULL。


#include <stdio.h> #include <stdlib.h>int main(void) {int *p = NULL;printf("before malloc p:%d\n", p); p = (int)malloc(sizeof(int)); //malloc一塊新內存,讓p指向這塊內存printf("after malloc p:%d\n", p); //打印p的值*p = 3;printf("*p:%d\n", *p); //打印p指向的那塊內存空間的值free(p); //釋放p指向的那塊內塊空間printf("after free p:%d\n", p); // 注意:此時p中的值沒有發生變化,但是free內存后已經失去了對堆上那塊內存的合法操作性*p = 4; //非法向內存中賦值,程序可能會崩潰printf("*p:%d\n", *p);return 0; }


(3)?指針操作超越變量作用域 ? ???

不要返回指向棧內存的指針或引用,因為棧內存在函數結束時會被釋放。



#include <stdio.h> #include <stdlib.h>char *getStr() {char p[] = "abcdefg"; //在getStr()函數內部聲明一個局部數組,p在getStr()函數的棧上 printf("getStr %s\n", p);return p; //返回這個數組的首地址 }int main(void) {char *pStr = getStr(); //接收getStr()函數中局部數組的首地址//注意:當getStr()函數調用結束后,它內部的局部變量就會被釋放,在main函數中打印pStr時,可能會輸出”abcdefg”,但不代碼這樣是合法的.printf("main %s\n", pStr); //打印pStr所指向的內存塊中的值system("pause");return 0; }



關鍵點: 上面的程序在運行時可能并不會產生錯誤,但并不代表這樣做是正確的,理解野指針的關鍵,就是指針指向的內存是否可以被合理合法訪問。

3.?避免產生野指針
(1) 初始化時置 NULL

(2) 指針指向的內存釋放后之后將指針置為空












本文轉自:

http://bbs.itheima.com/thread-329321-1-1.html?cazn





總結

以上是生活随笔為你收集整理的C语言野指针分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。