返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解C语言中return返回函数局部变量的问题
  • 492
分享到

详解C语言中return返回函数局部变量的问题

2024-04-02 19:04:59 492人浏览 独家记忆
摘要

目录return返回栈区局部变量的指针return返回栈区局部的临时变量return只读数据段和static数据在计算机中,释放空间并不需要将空间中的内容全部置成0或者1,而是只要设

在计算机中,释放空间并不需要将空间中的内容全部置成0或者1,而是只要设置这一块空间的数据无效即可。比如在下载文件时需要花很长时间,但是删除文件却只要几秒钟,这是因为操作系统只是把文件标识(文件头链接)删掉了,文件原文还保留着,我们没了文件标识就找不到这个文件了。所以删除后的文件,还可以用特殊的办法被找回来。

这也就意味着,当函数结束调用的时候,函数中的局部变量实际上还是在的,只是函数原来的空间还给编译器(释放)了,也就是说函数中的局部变量是可以被编译器修改的。
虽然函数结束后空间还给了编译器,但是我们依然可以通过指针找到对应的局部变量的空间。

return返回栈区局部变量的指针

通过上面的分析,如果我们返回局部变量的指针,是不是可以直接找到这个局部变量呢?

返回了一个局部变量的指针,而恰好局部变量偏偏又在函数结束后销毁,但指针并没有被销毁,而是被返回,那也就是说,指针指向的正是一个被销毁了的对象。

比如下面的代码:


#include <stdio.h>
char* returnStr()
{
    char p[] = "hello world!";
    return p;
}
int main()
{
    char* str;
    str = returnStr();
    printf("%s\n", str);
    return 0;
}

在这里插入图片描述

可以看到原来p的空间已经被修改了,但是很奇怪,是谁进行的修改呢?

通过调试可以发现,当函数结束后,运行printf打印之前,str指向的空间中的字符串是在的:

在这里插入图片描述

但是一运行printf打印操作,str指向的空间中的字符串就会被修改:

在这里插入图片描述

这其实很好解释,因为printf本身也是一个函数,函数都是在栈区开辟的,而函数开辟的空间叫做栈帧,函数结束栈帧就还给了编译器:

在这里插入图片描述

了解了这些,那是不是只要我们多建立几个函数栈帧,是不是就可以使returnStr的函数栈帧不被覆盖了?答案是肯定的:


#include <stdio.h>
char* fun6()
{
    char p[] = "hello world";
    return p;
}
char* fun5()
{
    return fun6();
}
char* fun4()
{
    return fun5();
}
char* fun3()
{
    return fun4();
}
char* fun2()
{
    return fun3();
}
char* fun1()
{
    return fun2();
}
char* fun()
{
    return fun1();
}
int main()
{
    char* str;
    str = fun();
    printf("%s\n", str);
    return 0;
}

在这里插入图片描述

在这里插入图片描述

不过随着函数栈帧的逐渐增多,原来的fun6函数空间迟早也会被覆盖。

在函数体内定义的局部变量是有临时性的,当局部变量释放后随时都有可能会被修改,所以我们不能通过指针使用已经被释放的局部变量。

return返回栈区局部的临时变量

如果我们不返回指针,而是返回局部变量会怎么样呢?
按理来说局部变量也会被修改。


#include<stdio.h>
int test()
{
	int a = 10;
	return a;
}
int main()
{
	int b = test();
	printf("%d", b);
}

在这里插入图片描述

通过反汇编可以看到,局部变量a的值10通过寄存器交给了调用的b,所以即使局部变量a空间的10已经被修改,也不会影响b的内容:

在这里插入图片描述

return只读数据段和static数据

如果返回只读字符串则不会被覆盖,因为数据不是在栈区,而是在静态区:

在这里插入图片描述

同理如果将字符串用static修饰也是如此:

在这里插入图片描述

另外,返回堆内的指针也是可以的。

到此这篇关于详解C语言中return返回函数局部变量的问题的文章就介绍到这了,更多相关C语言return返回函数局部变量内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解C语言中return返回函数局部变量的问题

本文链接: https://lsjlt.com/news/133916.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解C语言中return返回函数局部变量的问题
    目录return返回栈区局部变量的指针return返回栈区局部的临时变量return只读数据段和static数据在计算机中,释放空间并不需要将空间中的内容全部置成0或者1,而是只要设...
    99+
    2024-04-02
  • C语言基础全局变量与局部变量教程详解
    目录一:局部变量与全局变量1.1:局部变量1.2:全局变量1.3:代码解释1.4:const修饰的变量的修改二:静态局部变量与静态全局变量2.1:static关键字2.2:静态局部变...
    99+
    2024-04-02
  • C语言中函数返回值不一致问题
    目录C语言函数返回值不一致函数的返回值注意事项函数的返回值注意事项总结C语言函数返回值不一致 在运行成程序上有时会发现函数内部的值与返回到主函数的值会相差很多出现随机值,但是它们的地...
    99+
    2023-02-24
    C语言函数 函数返回值不一致 C语言函数返回值
  • 函数返回局部变量的指针是否安全?
    这篇文章将为大家详细讲解有关函数返回局部变量的指针是否安全?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。函数返回局部变量的指针的安全隐患 在 C/C++ 编程语言中,函数返回局部变量的指针可能导致严重的...
    99+
    2024-04-02
  • C语言返回值指针的函数详解
          #include<stdio.h> void main() { int a[5] = { 1,3,5,7,9 }; ...
    99+
    2024-04-02
  • C语言中函数返回值不一致问题如何解决
    本文小编为大家详细介绍“C语言中函数返回值不一致问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中函数返回值不一致问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C语言函数返回值不一致...
    99+
    2023-07-05
  • C++中的函数返回值问题
    目录1、返回值2、指针类型的函数——返回指针3、返回引用4、综合示例首先,强调一点,和函数传参一样,函数返回时也会做一个拷贝。 从某种角度上看,和传参一样,也...
    99+
    2024-04-02
  • C语言中全局变量与局部变量的示例分析
    小编给大家分享一下C语言中全局变量与局部变量的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:局部变量与全局变量1.1:局部变量局部变量:在函数内部定义...
    99+
    2023-06-25
  • 通过实例详解C语言函数返回值
    目录前言C语言返回值c语言函数调用后必须带回返回值总结前言 函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句...
    99+
    2024-04-02
  • C语言main()函数的参数问题详解
    #include<stdio.h> void main(int argc, char* argv[]) { while (argc > 1) { ++a...
    99+
    2024-04-02
  • 如何理解函数体内局部变量定义的问题
    这篇文章主要介绍“如何理解函数体内局部变量定义的问题”,在日常操作中,相信很多人在如何理解函数体内局部变量定义的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解函数...
    99+
    2024-04-02
  • Python函数中的全局变量详解
    目录1、什么是全局变量?2、在函数外部定义的变量是全局变量。3、在函数内部定义中添加global关键词后变成全局变量。总结1、什么是全局变量? 在Python中,全局变量指的是可以作...
    99+
    2024-04-02
  • C语言中关于scanf函数的一些问题详解
    在学习创建二叉树时遇到了scanf的一些问题,在此记录下来 创建根节点A后理想情况是输入A的左子树,若不为空继续创建左子树,但输入A后发现重复创建了一个左子树,测试后发现输入A换行...
    99+
    2024-04-02
  • Mysql使用sum()函数返回null的问题详解
    目录介绍问题验证解决区别参考总结介绍 SUM()函数用于计算一组值或表达式的总和,SUM()函数的语法如下: SUM(DISTINCT expression) SUM()函数是如何...
    99+
    2024-04-02
  • C语言中回调函数和qsort函数的用法详解
    目录回调函数指向函数指针数组的指针qsort(qulick sort)-库函数回调函数 通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调...
    99+
    2024-04-02
  • C语言的可变参数函数实现详解
    目录1、简介2、简单的使用方式总结1、简介 今天看到一个有趣的东西C语言的可变参数函数 众所周知,C语言的函数不能重载,那么你printf和scanf是怎么可以输入多个参数的 例如查...
    99+
    2024-04-02
  • C语言中返回值指针函数的示例分析
    这篇文章主要为大家展示了“C语言中返回值指针函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中返回值指针函数的示例分析”这篇文章吧。   #inc...
    99+
    2023-06-29
  • C语言中回调函数的使用详情
    目录1.程序架构2.回调函数的作用3.掌握回调函数的程序编写4.回调函数在产品中的应用下文将学习到; 程序架构的核心理念和需求掌握回调函数的作用掌握回调函数的程序编写掌握回调函数在产...
    99+
    2024-04-02
  • C语言中getchar函数详解看这一篇就够了(函数功能、使用、返回值)
    目录getchar函数简介getchar函数执行过程详解(配图)​getchar用法示例解释一下:while ((ch=getchar()) != 'EOF'...
    99+
    2023-02-28
    C语言 getchar函数 getchar函数用法
  • c语言中使用了未初始化的局部变量怎么改
    c 语言中未初始化局部变量的改正方法有:1. 显式赋值;2. 指定初始值;3. 使用预处理器宏;4. 编译器选项。通过这些方法,可以确保局部变量在使用前被初始化,消除未定义行为的风险。 ...
    99+
    2024-05-10
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作