在C语言中函数及其调用过程

您所在的位置:网站首页 C语言函数的调用过程详细描述 在C语言中函数及其调用过程

在C语言中函数及其调用过程

2024-07-17 10:10| 来源: 网络整理| 查看: 265

目录函数C语言中的变参函数函数的本质是什么内存区域的区分技巧函数的调用过程栈帧的概念调用过程细节按照约定传参

函数

如果一个函数有声明没实现,那么就会出现链接错误:

以上代码会出现链接错误。

函数实现 int MyTest(int x, int y) { return x + y; }

以上是函数实现,函数实现可以与声明放在同一个文件中,也可以不在同一个文件 中。

函数调用 在运行过程中,函数名+括号+实参,可以实现函数调用。

实参与形参的概念 所谓的形参,就是在函数实现过程中,占位的参数,比如shang上方代码中的x,y都是形参 函数的作者,在实现函数时,是不知道函数调用时,形参的具体值的。在函数调用时,调用函数的作者,是具体知道参数的值,那个值,就是实参。 以上的5,6就是实参(实际传递的参数)。

return与返回值 return语句用于函数返回,并带出返回值(如果有)。 对于函数调用那一方,可以将函数调用后的返回值存储下来,也可以直接放弃。 除了“带出返回值”的作用外,还要加强“函数返回”的理解。所谓的函数返回,具体说就 是将执行流程跳转到调用当前函数的那一方

C语言中的变参函数 printf在MSDN中奇怪的资料

以上的中括号,其实是技术文档的约定,表示可选内容。所以,从C语言的角度看, printf的函数声明,其实是:

以上的三个英文句号(...),代表参数个数可变。也就是说,函数调用过程中,传递任意 多个实参,都会被认为语法正确。

变参函数,是我们可以发明更方便的函数,比如,计算任意多个正数的和。 另外,要注意,变参语法并没有颠覆之前学习的规则,也就是说,函数声明(又 称为函数原型)与函数的调用必须匹配。 实践以下代码加深对声明与调用必须匹配的理解

int main(int argc, char* argv[]) { char *szHello = ("hello,%d"); printf(szHello,10); } 函数的本质是什么

函数本身,其实就是一堆有意义的机器码。 我们可以通过调试过程中,反汇编窗口去确认。

内存区域的区分技巧

操作系统为了好管理,内存是分区域的。 对于去掉随机基地址的工程,我们可以通过内存地址,简单区分它属于哪块内存区 域。 全局区域:一般以0x004x开头,全局区域中一般存放:函数的机器码、字符串、 全局变量 栈区域:一般以0x0018、0x0019、0x0012开头,函数中的局部变量、函数调用 过程中的形参都会放在栈中 堆区域:暂时不用掌握

函数的调用过程

函数的调用过程,涉及两方: 函数的调用方(main) 函数的被调用方(MyAdd) 函数的调用及返回的过程,就是在调用方和被调用方切换流程的过程。 又因为函数肩负着接口的作用,所以,除了流程切换之外,还需要保证: 调用方传递的参数,可以被被调用方正确的获取 被调用方要能够传递出返回值,并且被调用方正确的获取 流程转移方面:过得去,回得来 那么,C程序中,函数调用过程的细节是如何的呢?

栈帧的概念

内存区域有一块被划分为栈,所有被调用的函数,都会使用这块区域,但是,他们的 局部变量、参数等并不会重叠。 每一次函数被调用,都有特定的一块占内存与这次调用对应,这称为“栈帧”。 开始调用某函数,会自动分配栈帧空间。 如果某函数调用结束,那么会回收栈帧空间,这个过程,称为平衡栈。

调用过程细节

大概的轮廓,逐一详细解释: 在函数调用过程中 按照调用约定传参(将实参复制到栈中) 保存返回地址 流程转移到被调用函数 保存上一层栈帧的地址 开辟局部变量空间 执行被调用函数的相关代码 最终将返回值存放在寄存器eax中 返回到调用方

按照约定传参

们为了不将问题复杂,我们现在只讨论C语言的默认调用约定,它具体的操作是: 从右往左传参 将参数依次push到内存的栈中 【实际操作请见视频】 实际上,C语言中的调用约定有三种: C约定:从右往左传参,通过内存栈区域传参,调用方平衡栈(调用方通过汇 编,修改esp及存取) _stdcall:传参方向和传参介质(内存)都与C约定一致。被调用方平衡栈。 _fastcall:传参方向从左往右,介质是寄存器+内存,被调用方平衡栈 从节省空间角度而言,_stdcall更优秀。

面试题:printf是什么约定?为什么? 答:C约定。因为printf是变参函数,变参函数只有调用方才知道具体传递了几个参 数,所以必须需要调用方平衡栈。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3