C 野指针

C 语言里出现野指针 ,指针悬挂的几种案例


野指针:

  在C语言中,野指针是指一个指向未知内存地址的指针,通常是因为指针没有被正确初始化或者指向的内存已经被释放掉了。这种情况可能导致程序崩溃或者产生不可预料的行为。下面是一些导致野指针出现的常见案例以及对应的代码说明:

  1. 指针未初始化:
#include <stdio.h>

int main() {
    int *ptr;
    *ptr = 10; // 未初始化的指针 ptr 被用来存储值
    printf("%d\n", *ptr);
    return 0;
}

在这个例子中,指针 ptr 没有被初始化,所以它指向的内存地址是未知的。当我们试图将值存储到该地址时,就会导致野指针的出现。

  1. 指针指向已经释放的内存:
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(sizeof(int));
    free(ptr); // 释放指针 ptr 指向的内存
    *ptr = 10; // 试图访问已经释放的内存
    printf("%d\n", *ptr);
    return 0;
}

在这个例子中,我们使用 malloc() 函数分配了一块内存,并将指针 ptr 指向该内存。然后我们释放了这块内存,但是在之后我们仍然尝试通过指针 ptr 访问这块已经释放的内存,这就导致了野指针的出现。

  1. 函数返回局部变量的地址:
#include <stdio.h>

int *getPointer() {
    int x = 10;
    return &x; // 返回局部变量 x 的地址
}

int main() {
    int *ptr = getPointer();
    printf("%d\n", *ptr);
    return 0;
}

在这个例子中,函数 getPointer() 返回了一个指向局部变量 x 的指针。当函数执行完毕后,x 被销毁,所以返回的指针指向的内存区域已经无效,这就导致了野指针的出现。

避免野指针的最好方法是确保指针被正确初始化,并且在释放内存后立即将指针设置为 NULL。此外,要注意在函数中返回指向局部变量的指针时要特别小心。



指针悬挂(dangling pointers)(指针悬空):

   第三种情况通常被称为指针悬挂(dangling pointers)。指针悬挂指的是指针仍然存在,但指向的内存已经不再有效或者不可访问。我来详细解释一下第三种情况的代码:

#include <stdio.h>

int *getPointer() {
    int x = 10;
    return &x; // 返回局部变量 x 的地址
}

int main() {
    int *ptr = getPointer();
    printf("%d\n", *ptr);
    return 0;
}

  在这个例子中,函数 getPointer() 返回了一个指向局部变量 x 的指针。当函数执行完毕后,x 被销毁,所以返回的指针指向的内存区域已经无效。但是,指针 ptr 仍然存在于 main() 函数中,并且它仍然存储着 x 的地址,但是这个地址现在指向的内容已经是不可预测的,因为该内存区域已经被释放。所以在 main() 函数中使用 ptr 所指向的内容就会导致未定义行为,这就是指针悬挂。

避免指针悬挂的最佳方式是确保指针不再指向无效的内存区域。在 C 语言中,这通常意味着在函数返回前释放的内存区域上,不要返回指针或者确保返回的指针指向有效的内存区域。

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值