悬挂指针与野指针
悬挂指针
简介
悬挂指针是指一个指针指向的内存已经被释放(例如,通过 free() 释放了动态分配的内存),但该指针依然存在并指向原来的位置。这时候,指针仍然指向一个已经无效的内存位置,被称为悬挂指针。
示例
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = malloc(sizeof(int)); // 动态分配内存
*ptr = 42; // 为指针分配的内存赋值
free(ptr); // 释放内存
// ptr 现在是悬挂指针,指向已释放的内存
printf("%d\n", *ptr); // 未定义行为:访问已释放的内存
return 0;
}
在这个例子中,free(ptr) 释放了内存后,ptr 变成了一个悬挂指针。后续对 ptr 的访问会导致未定义行为。
如何避免
将指针设为 NULL:在释放内存后,应该将指针设置为 NULL,因为访问 NULL 指针是已知的错误行为,而访问悬挂指针则不可预测。
free(ptr);
ptr = NULL; // 通过将指针置为 NULL 避免悬挂指针
野指针
简介
野指针是指一个未被初始化的指针,或者指向一个未知或不合法的内存地址的指针。野指针没有指向有效的内存地址,因此它是完全不可预测的,访问野指针通常会导致程序崩溃或数据损坏。
示例
#include <stdio.h>
int main() {
int *ptr; // 声明了一个指针,但没有初始化
// 直接使用未初始化的指针
printf("%d\n", *ptr); // 未定义行为:指针指向了随机地址
return 0;
}
如何避免
初始化指针:在使用指针之前,始终将其初始化为一个有效的地址,或者将其初始化为 NULL。
int *ptr = NULL; // 初始化指针

浙公网安备 33010602011771号