【C语言干货】野指针
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、什么是野指针?
- 二、野指针的三大成因
- 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的值(地址)并未改变
-
继续使用这个指针就是访问已释放的内存
-
可能导致数据混乱、程序崩溃或安全漏洞