悬挂指针与野指针

悬挂指针

简介

悬挂指针是指一个指针指向的内存已经被释放(例如,通过 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;  // 初始化指针
posted @ 2025-01-21 16:37  岸南  阅读(81)  评论(0)    收藏  举报