当前位置: 首页 > news >正文

网软志成企业网站管理系统资源网站推广

网软志成企业网站管理系统,资源网站推广,知名网络软文推广平台,网站设计风格及特点博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯什么是野指针?💯未初始化的指针代码示例问题分析解决方法 💯指针越界访问代码示例问题分析解决方法 💯指向已释放内存的…

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C语言

文章目录

  • 💯前言
  • 💯什么是野指针?
  • 💯未初始化的指针
    • 代码示例
    • 问题分析
    • 解决方法
  • 💯指针越界访问
    • 代码示例
    • 问题分析
    • 解决方法
  • 💯指向已释放内存的指针(悬空指针)
    • 代码示例
    • 问题分析
    • 解决方法
  • 💯小结


在这里插入图片描述


💯前言

  • C语言是一门以其高效灵活著称的编程语言,但与其高效性伴随而来的,是需要开发者非常小心地管理内存野指针Dangling Pointer)是 C 语言中的一个常见问题,指针的错误使用可能导致程序崩溃数据泄露,甚至被攻击者利用,成为严重的安全漏洞
    在本文中,我们将详细讲解野指针的三种常见情形,分析它们的成因危害以及如何防范,并通过代码示例让大家深入理解这些问题。
    C语言
    在这里插入图片描述

💯什么是野指针?

在这里插入图片描述

野指针是指向无法预测的内存地址的指针,其指向的地址往往是随机的无效的已失效的内存区域。当程序通过一个野指针去访问内存时,可能引发程序崩溃(如段错误)或者产生未定义行为

C语言 中,指针是基础特性之一,赋予程序员直接操作内存的能力,这也是 C 语言的灵活性高效性所在。然而,正是由于这种直接操作内存的能力,使得野指针问题在 C 语言中尤为常见且危险


💯未初始化的指针

在这里插入图片描述

未初始化的指针是指在定义指针变量时,未为其赋予初始值的指针。这种指针所包含的地址值是随机的,可能指向程序的任意内存区域,从而导致未定义行为。


代码示例

在这里插入图片描述

int main()
{int* p;      // 定义了一个指针变量 p,但未初始化*p = 20;     // 尝试通过 p 修改它指向的内存return 0;
}

问题分析

  • int* p; 这行代码中,指针 p 被定义,但并未被初始化,因此它的值是随机的,指向不可预测的内存位置。
  • 当执行 *p = 20; 时,程序试图向一个未知内存位置写入数据,这引发未定义行为,可能导致程序崩溃(例如段错误)或引发安全漏洞。

在这里插入图片描述


解决方法

  • 显式初始化指针:定义指针时,将其初始化为 NULL,这样可以确保指针不会指向任何有效的内存区域,直到它被显式赋值。
    int* p = NULL;
    
  • 分配合法的内存:在使用指针之前,确保它指向有效的内存,可以通过动态分配内存或者将其指向已有的变量。
    int a = 10;
    int* p = &a; // 指针指向变量 a 的地址
    
  • 启用编译器警告:现代编译器通常提供一些有用的警告选项,例如 -Wall,能够帮助开发者检测未初始化的指针并减少潜在的错误。
    在这里插入图片描述

💯指针越界访问

在这里插入图片描述

指针越界访问是指一个指针超出其合法内存范围,从而访问非法区域的情形。这种情况同样可能导致野指针的产生,并引发未定义行为。


代码示例

在这里插入图片描述

int main()
{int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 定义数组并初始化int *p = arr;                                  // 指针 p 指向数组首元素int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);         // 计算数组大小,sz = 10for (i = 0; i <= sz; i++)                      // 注意这里的循环条件为 i <= sz{printf("%d ", *p);                       // 试图打印指针 p 所指向的值p++;                                       // 指针 p 向后移动}return 0;
}

问题分析

  • for (i = 0; i <= sz; i++) 这一行中,i <= sz 使得循环多执行了一次,导致 i == sz 时,指针 p 指向了数组边界之外的内存位置,从而产生了野指针。
  • 试图通过 p 访问 arr 数组之外的内存是非法操作,可能导致程序崩溃,或者引发不易检测的安全问题。
    在这里插入图片描述

解决方法

  • 修正循环条件:将循环条件改为 i < sz,确保指针始终在数组的合法范围内。
    for (i = 0; i < sz; i++)
    
  • 加强边界检查:在操作指针时进行边界检查,确保不会超出合法的数组范围。
  • 避免手动递增指针:可以直接使用数组下标访问元素,避免手动管理指针的移动,以降低出错风险。
    for (i = 0; i < sz; i++) {printf("%d ", arr[i]);
    }
    

在这里插入图片描述



💯指向已释放内存的指针(悬空指针)

在这里插入图片描述

悬空指针是指向已释放或生命周期结束的内存区域的指针。当函数返回局部变量的地址,或内存被释放后仍继续使用该指针,就会导致悬空指针的问题。


代码示例

在这里插入图片描述

int* test() {int a = 10;   // 定义局部变量 a,并初始化为 10return &a;    // 返回局部变量 a 的地址
}int main() {int* p = test(); // 函数返回的局部变量地址赋值给指针 pprintf("%d\n", *p); // 通过 p 访问无效内存return 0;
}

问题分析

  • test 函数中,变量 a 是局部变量,存储在栈中。当函数执行完毕后,a 所在的栈帧被释放,其地址变得无效。
  • 指针 p 存储了 a 的地址,然而此时 p 成为了悬空指针,继续通过 p 访问该内存区域会导致未定义行为,可能引发程序崩溃或输出错误数据。
    在这里插入图片描述

解决方法

在这里插入图片描述

  1. 避免返回局部变量的地址

    • 可以通过动态内存分配或者静态变量来替代返回局部变量的地址。

    示例 1:动态内存分配

    int* test() {int* a = (int*)malloc(sizeof(int)); // 动态分配内存*a = 10;return a; // 返回分配的内存地址
    }int main() {int* p = test();printf("%d\n", *p); // 正常访问free(p);            // 用完后释放内存return 0;
    }
    

    示例 2:使用静态变量

    int* test() {static int a = 10; // 静态变量,生命周期贯穿程序运行return &a;         // 返回静态变量的地址
    }int main() {int* p = test();printf("%d\n", *p); // 正常访问return 0;
    }
    
  2. 确保指针始终指向有效内存

    • 在函数中返回指针时,必须确保返回的指针指向的内存是有效的,且不会在函数执行完毕后失效。
  3. 使用内存管理工具

    • 现代的内存管理工具(如 Valgrind 或 AddressSanitizer)可以有效地检测悬空指针问题,帮助开发者在开发和测试阶段发现和修复内存管理错误。

💯小结

  • 在这里插入图片描述C语言编程 中,指针的管理是至关重要的环节。C语言赋予开发者直接操作内存的能力,使得程序能够具备极高的性能,但这种能力也伴随着巨大的责任
    开发者需要掌握 指针的生命周期 以及它们在内存中的行为,从而确保程序的稳定安全。在大型项目中,内存管理指针操作尤为重要,团队开发时需要制定明确的标准代码规范,以避免因个人疏忽导致的指针错误
    此外,测试代码审查也应作为内存管理的重要环节,以确保代码在各种边界条件下都能正确运行

在这里插入图片描述


http://www.hyszgw.com/news/47126.html

相关文章:

  • 陈村九江网站建设自己做网站收费么
  • 网站设计文档模板云南网站新备案制
  • 怎样进入建设通网站动态二维码制作
  • 坪地网站建设效果php网站超市源码下载
  • 中山网站推广外包wordpress 让导航悬浮
  • 做网站 超速云注册营业执照网上申请入口
  • 网站建站步骤流程网站代码跑偏了怎么做
  • 做任务网站源码企业网站策划书ppt
  • 网站制作带优化购物网站建设精英
  • 怎么用源码做网站东莞大型企业网站建设
  • 做网站的代码有哪些长沙申请域名网站备案
  • 见网页制作的公司网站北京电商网站排行
  • 建设网站租用空间海口小微企业网站建设
  • 沈阳市网站设计公司大全国外企业建站
  • 什么是网站内容建设安徽网站建设推荐-晨飞网络
  • 怎样把自己做的网站上传到网上品牌设计属于平面设计吗
  • 谷歌官方网站注册wordpress 好评插件
  • php网站如何做特效庆阳网红刘斌
  • 协和医院网站建设目标石家庄网站建设外包公司排名
  • 做设计网站赚钱吗外贸一般在哪些网站
  • 建设实验中心网站热门网站建设招商项目
  • 手机网站打不开是什么原因造成的最好的响应式网站有哪些
  • 江西建设厅网站查询施工员泉州市培训建设系统中心网站
  • 建设旅游网站目的贵州网站建设推荐
  • 可以登录国外网站吗广西百度seo
  • 服务器做网站配置网站地图如何更新
  • 工信部如何查网站备案网站建设需要租赁服务器吗
  • 学校宣传策划方案优化方案系列丛书
  • 网站开发工程师发展趋势网站怎么优化排名
  • 做三折页的网站东莞建网站的公