【C语言】特殊指针汇总

news2024/12/21 19:35:45

前言

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

空指针

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

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

int *ptr = NULL; // 使用NULL宏定义空指针

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

常见用途

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

注意事项

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

野指针

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

代码示例

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

悬空指针

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

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

示例代码

释放后的指针
#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;
}
超出作用域的局部变量
#include <stdio.h>

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

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

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

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

万能指针

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 从控制台应用程序入门

总目录 前言 从创建并运行第一个控制台应用程序&#xff0c;快速入门C#。 一、新建一个控制台应用程序 控制台应用程序是C# 入门时&#xff0c;学习基础语法的最佳应用程序。 打开VS2022&#xff0c;选择【创建新项目】 搜索【控制台】&#xff0c;选择控制台应用(.NET Framew…

创新实训——前端:配置问题及解决

在配置前端环境中&#xff0c;出现了一些问题&#xff1a; Error: The following dependencies are imported but could not be resolved: element-plus (imported by C:/Users/30753/Desktop/cxsx/Coarse-grained-information-processing-front/src/request.js) element-plus…

【解决方案】三方云仓与各电商平台的电子面单对接

为实现三方云仓与各电商平台的电子面单对接&#xff0c;您需要确保您的WMS&#xff08;仓库管理系统&#xff09;能够通过奇门接口&#xff08;假设这是一个特定的API或中间件服务用于连接不同的系统&#xff09;与各个电商平台进行数据交换。下面是一个简化的解决方案框架&…

属性描述符

什么是属性描述符 1 数据描述符 2 存取描述符 3 获取属性描述符 4 设置属性描述符 4.1 配置writable 4.2 配置configurable 4.3 configurable的特殊性 4.4 配置enumerable 5.同时设置多个属性的属性描述符 6.get和set的用法具体看访问器属性getter和setter帖子。 什…

PostgreSQL技术内幕21:SysLogger日志收集器的工作原理

0.简介 在前面文章中介绍了事务模块用到的事务日志结构和其工作原理&#xff0c;本文将介绍日志的另一个部分&#xff0c;操作日志&#xff0c;主要去描述SysLogger日志的工作原理&#xff0c;流程以及其中关键的实现&#xff1a;日志轮转&#xff0c;刷盘性能问题等&#xff…

Unity3D仿星露谷物语开发6之角色添加动画

1、目的 给角色添加素材中的动画&#xff0c;最终让角色动起来。 2、准备工作 当前的预设体中的Player对象还不够完善&#xff0c;需要删除掉再优化下。此时应当&#xff1a;Hierarchy中的Player对象切断和预设体的关联&#xff0c;同时删除Prefabs中的Player对象。 首先&a…

Go框架比较:goframe、beego、iris和gin

由于工作需要&#xff0c;这些年来也接触了不少的开发框架&#xff0c;Golang的开发框架比较多&#xff0c;不过基本都是Web"框架"为主。这里稍微打了个引号&#xff0c;因为大部分"框架"从设计和功能定位上来讲&#xff0c;充其量都只能算是一个组件&…

CS 144 check4: interoperating in the world

Lectures Note 略 Exercises 执行cmake --build build --target check_webget发现超出12s了。 1、回看check0的代码&#xff0c;似乎不需要关闭写入方向&#xff0c;于是注释掉&#xff08;关键&#xff09; 2、将request的变量类型从string转为string_view&#xff08;顺手…

现代风格VUE3易支付用户控制中心

适用系统 彩虹易支付 技术栈 vitevue3elementuiplusphp 亮点 独立前端代码,扩展开发,不改动系统文件,不影响原版升级 支持功能订制 界面预览

go语言zero框架中启动脚本.sh的编写与配置

在Go语言项目中&#xff0c;编写启动脚本 (.sh 文件) 通常用于自动化启动Go程序、配置环境变量、执行一些初始化任务或处理不同环境下的配置。下面是编写和配置启动脚本的步骤。 ### 1. 基本的 .sh 启动脚本 假设你已经在 Go 中编写了应用程序并编译为二进制文件&#xff0c;启…

React,Antd实现文本输入框话题添加及删除的完整功能解决方案

最终效果就是实现该输入框&#xff1a; 添加话题时&#xff0c;话题自动插入到输入框前面多文本输入框左侧间距为话题的宽度多行文本时&#xff0c;第二行紧接开头渲染删除文本时&#xff0c;如果删除到话题&#xff0c;再次删除&#xff0c;话题被删除 首先构造div结构 cons…

坑人 C# MySql.Data SDK

一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MySql.Data,这就让人无语了,并且反馈都是升级了MySql.Data驱动引发,接下…

(五)FT2232HL高速调试器之--三步实现STM32的VSCODE在线仿真工程搭建

对于单片机开发&#xff0c;rtthread studios 与 vscode&#xff0c;鱼与熊掌可以兼得否&#xff0c;其实是可以的&#xff0c;下面通过三个步骤&#xff0c;实现基于FT2232HL高速调试器的&#xff0c;stm32的VSCODE在线仿真工程的搭建。 1、软件下载与VSCODE插件安装配置 软…

【计算机网络】lab2 Ethernet(链路层Ethernet frame结构细节)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现 在之前的教程中完成了分类页面的左右两侧的列表结构&#xff0c;如下图所示。 接下来需要实现左侧分类导航项的点击操作&#xff0c;可以友好的提示用户选择了哪一个文字分类导航项。 一、左侧文字分类导航的处理 …

数字IC后端零基础入门基础理论(Day1)

数字IC后端设计导入需要用到的input数据如下图所示。 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 Netlist: 设计的Gate level&#xff08;门级&#xff09;网表。下图所示为一个计数器设计综合后的门级netlist。 从这个netlist中我们看到这个设计顶层的名字叫counte…

如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到

想要编译opencvffmpeg&#xff1a; 1.安装ffmpeg 随便位置&#xff08;具体看ffmpeg 编译安装&#xff09; 执行下面命令&#xff0c;其中/usr/local/ffmpeg/lib/pkgconfig是你实际的ffmpeg路径 export PKG_CONFIG_PATH$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig2.下载…

三维视频融合在数字孪生中的应用

一、在提升监控效率与决策准确性方面的应用 改善监控视角与理解&#xff1a;在数字孪生场景下&#xff0c;三维视频融合技术能够将监控视频与三维环境相结合。例如在城市安防、工业生产、大型活动等场景中&#xff0c;形成连续、实时、动态的三维全景拼接图。这解决了传统监控…

语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限

环境&#xff1a; Win10专业版 谷歌浏览器 版本 131.0.6778.140&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; 问题描述&#xff1a; 局域网web语音识别出现识别失败 chrome控制台出现下获取浏览器录音功能&#xff0c;因为安全性问题&#xff0c;需要在…

计算机网络-传输层 TCP协议(上)

目录 报头结构 TCP的可靠传输机制 核心机制一&#xff1a;确认应答 TCP的序号和确认序号 核心机制二&#xff1a;丢包重传 核心机制三&#xff1a;连接管理 建立连接-三次握手 断开连接-四次挥手 核心机制四&#xff1a;滑动窗口 数据包已经抵达, ACK被丢了 数据包就…