【C语言】特殊指针汇总

前言

C语言的指针有多种类型,除了常用的那几类之外我们还有多种特殊指针会使用到,接下来我会介绍一下四种特殊指针,特别是空指针和野指针,在实际的编程中会经常遇到。

空指针

空指针(Null Pointer)是一种特殊的指针,它不指向任何有效的内存地址。在C语言中,空指针通常用于表示一个无效的指针。

在C语言中,空指针可以通过以下方式定义:

cs 复制代码
int *ptr = NULL; // 使用NULL宏定义空指针

NULL是一个宏,通常定义为((void*)0),表示一个空指针常量。

常见用途

  1. 初始化指针:在声明指针时,将其初始化为空指针,以确保在后续代码中可以安全地检查和使用该指针。
  2. 动态内存分配失败处理 :在动态内存分配(如使用malloccalloc等函数)时,如果分配失败,这些函数会返回空指针。这时需要检查并处理这种情况。
  3. 函数参数:在函数中使用指针作为参数时,可以使用空指针来表示某些特殊情况,比如没有数据或不需要传递数据。

注意事项

  • 避免解引用空指针:解引用空指针会导致未定义行为,通常会导致程序崩溃。因此,在使用指针之前一定要检查其是否为空。
  • 释放内存后置空:在释放动态分配的内存后,将指针置为空指针可以避免悬挂指针(Dangling Pointer)问题,即指针仍然指向已释放的内存区域。
  • 初始化指针:在声明指针时尽量将其初始化为空指针,这样可以确保在使用前进行有效性检查。

野指针

野指针(Dangling Pointer)是指向没有初始化的指针,声明了一个指针但没有初始化它,导致它指向一个未知的内存地址。

代码示例

未初始化的指针
cs 复制代码
int *ptr; // 未初始化的指针
*ptr = 10; // 解引用未初始化的指针,会导致未定义行为

悬空指针

悬空指针(Dangling Pointer)是指向已经被释放或无效内存地址的指针。在C语言中,悬空指针通常由以下几种情况引起:

  1. 释放后的指针:指针指向的内存已经被释放,但指针本身没有被置为空指针。
  2. 超出作用域的局部变量:指针指向一个已经超出其作用域的局部变量。
  3. 数组越界访问:指针指向数组的非法位置。

示例代码

释放后的指针
cs 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(sizeof(int));
    if (ptr == NULL) {
        printf("Memory allocation failed.\n");
        return -1;
    }
    *ptr = 42;
    free(ptr); // 释放内存
    // 此时ptr成为悬空指针,因为它指向的内存已经被释放
    *ptr = 50; // 使用已释放的内存,会导致未定义行为
    return 0;
}
超出作用域的局部变量
cs 复制代码
#include <stdio.h>

void func() {
    int localVar = 10;
    int *ptr = &localVar; // 指向局部变量的指针
}

int main() {
    int *ptr;
    func();
    // ptr = &localVar; // 错误:localVar超出了作用域,ptr成为悬空指针
    return 0;
}
数组越界访问
cs 复制代码
#include <stdio.h>

void func() {
    int localVar = 10;
    int *ptr = &localVar; // 指向局部变量的指针
}

int main() {
    int *ptr;
    func();
    // ptr = &localVar; // 错误:localVar超出了作用域,ptr成为悬空指针
    return 0;
}
如何避免悬空指针
  • 避免返回局部变量的地址:确保指针不要指向已经销毁的局部变量。
  • 使用动态内存分配:如果需要返回指针,确保返回指向动态分配内存的指针,直到手动释放内存。

万能指针

万能指针是指不指定指向数据类型的指针,它使用 void 类型来声明。void* 类型的指针可以指向任何类型的数据,但它不能直接解引用,因为没有具体的数据类型。

相关推荐
Hello_WOAIAI24 分钟前
2.4 python装饰器在 Web 框架和测试中的实战应用
开发语言·前端·python
搬山.摧城31 分钟前
线程池和单例模式
开发语言·单例模式
百锦再34 分钟前
第1章 Rust语言概述
java·开发语言·人工智能·python·rust·go·1024程序员节
一叶之秋14121 小时前
QT背景介绍与环境搭建
开发语言·qt
java1234_小锋1 小时前
PyTorch2 Python深度学习 - 模型保存与加载
开发语言·python·深度学习·pytorch2
ACP广源盛139246256731 小时前
(ACP广源盛)GSV2231---DisplayPort 1.4 MST 到 HDMI 2.0/DP/Type-C 转换器(带嵌入式 MCU)
c语言·开发语言·单片机·嵌入式硬件·音视频·mst
quant_19861 小时前
【教程】使用加密货币行情接口 - 查询比特币实时价格
开发语言·后端·python·websocket·网络协议
熊猫_豆豆1 小时前
Python 写一个标准版和程序员版计算器
开发语言·python·计算器
Mr.Jessy2 小时前
Web APIs 学习第四天:DOM事件进阶
开发语言·前端·javascript·学习·ecmascript
QT 小鲜肉2 小时前
【QT/C++】Qt网络编程进阶:UDP通信和HTTP请求的基本原理和实际应用(超详细)
c语言·网络·c++·笔记·qt·http·udp