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