f 程序人生-C-悬挂指针和野指针 - Powered by qidao123.com技术社区

C-悬挂指针和野指针

打印 上一主题 下一主题

主题 1584|帖子 1584|积分 4752

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、题目形貌

      字符指针传址进入函数,在函数内将指针指向的内存释放、指针置空,在函数外指针地址仍不变;此时访问该悬挂指针指向的内存可能会导致程序非常等题目。
二、悬挂指针和野指针

1.悬挂指针

        悬挂指针是一个指针,它指向的内存在之前是有用的,但由于某些操作(如内存释放)后变得不再有用。悬挂指针仍然保留着指向已释放内存的地址。
  1. static char* g_str = NULL;
  2. static void test(char* str)
  3. {
  4.     //str传址拷贝至函数内,在函数里将str置空,只是下文中str为空指针无法访问,未改变g_str的地址
  5.     str = NULL;
  6. }
  7. int main()
  8. {
  9.     g_str = (char*)malloc(32);
  10.     free(g_str);
  11.     test(g_str);
  12.     printf("str addr is %p", g_str); //地址非空
  13.     if(g_str != NULL) {
  14.         printf("str addr is %s", g_str); //访问已释放内存
  15.     }
  16. }
复制代码
导致的题目:
1. 数据不一致:如果悬挂指针指向的内存被操作体系接纳并重新分配给其他用途,通过悬挂指针访问该内存可能导致数据不一致;
2. 内存走漏:如果悬挂指针没有被置为 NULL,内存未接纳,可能导致内存泄漏;
3. 段错误:如果指针指向的内存已释放,再次访问指针,通常会导致程序触发段错误。
2.野指针

       野指针是一个指针,它指向的内存地区是未界说的,或者不是当前程序分配的内存。这可能包括指向已经被释放的内存、未初始化的指针、或者指向程序栈之外的内存。
1. 未初始化的指针
  1. int main() {
  2.     int *p; // 未初始化的指针
  3.     printf("Value at p: %d\n", *p); // 未定义行为,可能导致程序崩溃
  4.     return 0;
  5. }
复制代码
2. 指向未界说的内存
  1. int main() {
  2.     int arr[5] = {1, 2, 3, 4, 5};
  3.     int *p = arr + 5; // 指向数组最后一个元素的下一个位置
  4.     // p 现在是一个野指针,因为它超出了数组的边界
  5.     printf("Value at p: %d\n", *p);
  6.     return 0;
  7. }
复制代码
3. 函数返回局部变量的地址
  1. int *function() {
  2.     int local_var = 42;
  3.     return &local_var; // 返回局部变量的地址
  4. }
  5. int main() {
  6.     int *p = function();
  7.     printf("Value at p: %d\n", *p); // 未定义行为,因为 local_var 已经超出作用域
  8.     return 0;
  9. }
复制代码
        local_var变量在函数实行竣事时,内存会被释放,此时返回函数的地址;使得p指向了未界说的内存,可能会程序非常或读取到错误数据。

总结

    函数内需要谨慎进行址转达,可以通过动态申请内存、使用后释放的方式,防止指针指向未界说内存;为指针动态申请内存、释放内存后,需要将指针置空,防止出现悬挂指针访问非常情况。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表