网站首页 > 文章中心 > 其它

c语言堆栈函数返回地址_c语言函数大全及详解

作者:小编 更新时间:2023-09-28 10:12:05 浏览量:38人看过

C语言中函数返回指向栈内存的指针的问题

p是指向局部变量的指针,当函数退出时,局部变量会被释放,这时,p所指向的位置就不一样是原来的数.

因为fun()函数返回的值被计算机的临时变量存放,当赋值给p的时候,p是指向临时变量的地址,所以还可以读取出100.

*p = "hello"这是常量字符串,从静态存储区分配,第一步字符串"hello"从静态存储区获取一块内存,指针变量p才指向这块静态内存,这块内存的特点是从程序开始到结束一直从在,所以可以返回.

扩展资料:

函数的返回值类型是在定义函数时指定的.return 语句中表达式的类型应与定义函数时指定的返回值类型一致.如果不一致,则以函数定义时的返回值类型为准,对 return 语句中表达式的类型自动进行转换,然后再将它返回给主调函数使用.

在调用函数时,如果需要从被调函数返回一个值供主调函数使用,那么返回值类型必须定义成非 void 型.此时被调函数中必须包含 return 语句,而且 return 后面必须要有返回值,否则就是语法错误.

C语言函数调用栈

程序的执行过程可看作连续的函数调用.当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行.函数调用过程通常使用堆栈实现,每个用户态进程对应一个调用栈结构(call stack).编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有值(即函数调用的上下文)以备恢复以及存储本地局部变量.

不同处理器和编译器的堆栈布局、函数调用方法都可能不同,但堆栈的基本概念是一样的.

寄存器是处理器加工数据或运行程序的重要载体,用于存放程序执行中用到的数据和指令.所以呢函数调用栈的实现与处理器寄存器组密切相关.

函数调用栈的典型内存布局如下图所示:

其中,主调函数将参数按照调用约定依次入栈(图中为从右到左),然后将指令指针EIP入栈以保存主调函数的返回地址(下一条待执行指令的地址).进入被调函数时,被调函数将主调函数的帧基指针EBP入栈,并将主调函数的栈顶指针ESP值赋给被调函数的EBP(作为被调函数的栈底),接着改变ESP值来为函数局部变量预留空间.此时被调函数帧基指针指向被调函数的栈底.以该地址为基准,向上(栈底方向)可获取主调函数的返回地址、参数值,向下(栈顶方向)能获取被调函数的局部变量值,而该地址处又存放着上一层主调函数的帧基指针值.本级调用结束后,将EBP指针值赋给ESP,使ESP再次指向被调函数栈底以释放局部变量;再将已压栈的主调函数帧基指针弹出到EBP,并弹出返回地址到EIP.ESP继续上移越过参数,最终回到函数调用前的状态,即恢复原来主调函数的栈帧.如此递归便形成函数调用栈.

EBP指针在当前函数运行过程中(未调用其他函数时)保持不变.在函数调用前,ESP指针指向栈顶地址,也是栈底地址.在函数完成现场保护之类的初始化工作后,ESP会始终指向当前函数栈帧的栈顶,此时,若

x86上为什么C语言调用一个函数要先把参数压栈,之后才是返回地址

返回地址先于参数入栈是不可能的== 因为参数入栈是调用函数通过push指令完成的 而返回地址入栈则是在call指令中自动完成的 所以呢如果一定要先把返回地址压栈 就需要先调用call指令 call指令返回之后 程序就已经在被调函数里面了 调用函数已经失去了控制权 不可能再通过push指令把参数压栈了......

以上就是土嘎嘎小编为大家整理的c语言堆栈函数返回地址相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章