提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、什么是野指針?
- 二、野指針的三大成因
- 1.指針未初始化
- 2.指針越界訪問
- 2.指針指向已釋放的內存
前言
提示:以下是本篇文章正文內容,下面案例可供參考
一、什么是野指針?
野指針是指向"無效內存區域"的指針。這些指針可能指向:
-
已經釋放的內存
-
未初始化的隨機地址
-
超出合法范圍的地址
使用野指針就像在現實生活中使用一個錯誤的地址去寄信——你無法預測信會送到哪里,甚至可能造成嚴重的后果。
二、野指針的三大成因
1.指針未初始化
問題代碼:
c
復制
下載
#include <stdio.h>int main() {int *p; // 未初始化的局部指針變量,值是隨機的*p = 10; // 向未知內存寫入數據,危險!return 0;
}
分析:
-
局部變量未初始化時,其值是隨機的(棧上的垃圾值)
-
這個隨機值被當作內存地址使用
-
對該地址的讀寫操作可能導致段錯誤(Segmentation Fault)或悄無聲息地破壞其他數據
2.指針越界訪問
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int *p = arr;for(int i = 0; i <= 5; i++) { // 故意越界*(p++) = i * 10;}return 0;
}
分析:
-
數組arr只有5個元素,有效索引是0-4
-
循環訪問了arr[5],這已經越界
-
越界后p指向的內存可能屬于其他變量或不可訪問區域
-
可能破壞棧上的其他數據(如返回地址),導致程序異常
3. 指針指向已釋放的內存
#include <stdio.h>
#include <stdlib.h>int *create_array(int size) {int *arr = (int *)malloc(size * sizeof(int));for(int i = 0; i < size; i++) {arr[i] = i + 1;}return arr;
}int main() {int *my_array = create_array(5);free(my_array); // 內存已釋放// 錯誤:使用已釋放的內存printf("%d\n", my_array[2]); return 0;
}
分析:
-
free()
釋放了my_array指向的內存 -
但my_array的值(地址)并未改變
-
繼續使用這個指針就是訪問已釋放的內存
-
可能導致數據混亂、程序崩潰或安全漏洞