逍遙自在學C語言 | 指針陷阱-空指針與野指針
前言
在C語言中,指針是一種非常強大和靈活的工具,但同時也容易引發一些問題,其中包括空指針和野指針。
本文將帶你了解這兩個概念的含義、產生原因以及如何避免它們所導致的問題。
一、人物簡介
- 第一位閃亮登場,有請今后會一直教我們C語言的老師 —— 自在。

- 第二位上場的是和我們一起學習的小白程序猿 —— 逍遙。

二、空指針
-
空指針是指不指向任何有效內存地址的指針。
-
在C語言中,可以用NULL宏來表示空指針。
-
當一個指針被賦值為NULL時,它不指向任何有效的內存位置。
-
下面是一個示例代碼,演示了如何使用空指針:
#include <stdio.h>
int main() {
int *ptr = NULL; // 聲明一個指向整數的空指針
if (ptr == NULL) {
printf("指針為空。\n");
} else {
printf("指針不為空。\n");
}
return 0;
}
- 輸出結果:
指針為空。
-
在上述代碼中,我們聲明了一個指向整數的空指針
ptr,并將其賦值為NULL。 -
然后,我們使用條件語句檢查指針是否為空,并打印相應的消息。
三、野指針
-
野指針是指指向未知、無效或已釋放的內存位置的指針。
-
當一個指針被賦值為未初始化的值、已經釋放的內存地址,或者指向一個不再有效的對象時,它就成為了野指針。
-
下面是一個示例代碼,演示了野指針的行為:
#include <stdio.h>
int main() {
int *ptr; // 未初始化的指針
*ptr = 42; // 野指針的解引用
printf("野指針的值: %d\n", *ptr);
return 0;
}
- 輸出結果:
Segmentation fault
-
在上述代碼中,我們聲明了一個未初始化的指針
ptr,然后嘗試對其進行解引用并賦值。 -
由于該指針沒有指向任何有效的內存地址,這將導致程序崩潰并引發段錯誤。
四、空指針和野指針的產生
空指針和野指針的產生主要源于以下幾種情況:
1、空指針的產生
- 在聲明指針時將其初始化為NULL:當我們聲明一個指針但沒有為其分配有效的內存地址時,可以將其初始化為NULL,表示該指針不指向任何有效的內存位置。
- 在釋放內存后未將指針置為NULL:當我們釋放了一個指針所指向的內存后,為了避免野指針的產生,應該將指針設置為NULL。否則,該指針將繼續指向已經釋放的內存位置,成為野指針。
2、 野指針的產生
- 未初始化的指針:當我們聲明一個指針但未對其進行初始化時,該指針的值是未知的。
- 已釋放的內存地址:當我們釋放了一塊內存后,如果仍然持有指向該內存地址的指針,并且對該指針進行解引用操作,就會導致野指針的產生。
- 指向超出作用域的局部變量:當一個指針指向了超出其所在作用域的局部變量時,當該指針被使用時就會產生野指針。這是因為當函數返回后,局部變量的內存將不再有效,但指針仍然保持指向該內存地址。
五、 空指針和野指針導致的問題
空指針和野指針可能導致以下問題:
- 程序崩潰:當野指針被解引用時,訪問無效的內存位置可能導致程序崩潰,并引發諸如段錯誤等的運行時錯誤。
- 內存泄漏:如果指針被設置為指向一塊已釋放的內存,這將導致內存泄漏。內存泄漏會消耗系統資源,并可能導致程序性能下降或崩潰。
- 無法預測的行為:對空指針或野指針進行解引用操作會導致不可預測的行為,因為訪問的內存位置是未知的。
六、避免產生野指針的方法
- 初始化指針變量:在聲明指針變量后,確保及時為其分配有效的內存地址。
- 及時釋放內存并置空指針:在不再需要使用某個指針指向的內存時,及時釋放該內存,并將指針設置為NULL。
- 避免越過作用域使用指針:確保指針不會超出其所在作用域范圍。當指針指向局部變量時,確保在變量超出作用域前不再使用該指針。
- 注意指針的生命周期:在使用指針時,了解指針所指向的對象的生命周期。確保指針只在對象有效的時間段內使用,并在對象失效后避免使用指針。
小結
通過這篇文章,我們學會了
1、空指針的概念
2、野指針的概念
3、空指針和野指針的產生
4、空指針和野指針導致的問題,避免野指針產生的方法。
??歡迎各位 ??點贊 ?收藏 ??評論,如有錯誤請留言指正,非常感謝!

浙公網安備 33010602011771號