void fn(){}; 5: 55 push %ebp
int main(){ 6: 89 e5 mov %esp,%ebp
void (*pf)(void)=&fn; 8: 83 e4 f0 and $0xfffffff0,%esp
(*pf)(); b: 83 ec 10 sub $0x10,%esp
} e: e8 00 00 00 00 call 13 <_main+0xe>
13: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp)
1a: 00
1b: 8b 44 24 0c mov 0xc(%esp),%eax
1f: ff d0 call *%eax
21: b8 00 00 00 00 mov $0x0,%eax
26: c9 leave
27: c3 ret
语句sub $0x10,%esp在栈上分配空间为16个字节,而pf占用了栈底部4字节地址,0xc(%esp)是变量pf在栈上分配的地址。
注意到movl $0x0,0xc(%esp),这里实际就是将函数地址0x0赋予了变量pf,而后pf这个内存变量的内容会被赋予到eax寄存器,函数fn()的代码通过call *%eax被调用,这个调用非常容易理解。
注意下面这个代码也是可以工作的:
void fn(){};
int main(){
(*fn)(); call 0 <__Z2fnv>
}
注意这里fn()直接使用函数指针的语法进行了调用,编译器产生的汇编没有使用变量,直接按函数地址调用了fn()。
分享到:
相关推荐
### 从缺陷中学习C++:深入探讨C/C++编程中的常见问题与解决方案 #### 序章:背景介绍与初衷 在《从缺陷中学习C++电子版》这份由淘宝内部资料改编而成的学习资料中,作者以个人经历出发,回顾了自己与C/C++这一...
在C++中,构造函数不能声明为虚函数,这是因为构造函数是在对象创建时调用的,而虚函数机制依赖于动态绑定,这在对象尚未完全构造完成时无法实现。 #### 队列与栈的区别 队列遵循先进先出(FIFO)原则,新元素添加...
4. **C++程序中调用被C编译器编译后的函数时加extern "C"声明的原因**: - C++支持函数重载,而C不支持。加上`extern "C"`可以告诉C++编译器按照C语言的方式来处理符号,避免命名冲突。 5. **两种for循环的优缺点**...
在C/C++中,“extern”关键字用于声明变量或函数是在其他源文件中定义的。它告诉编译器该变量或函数的定义位于别处。 #### Auto 自动 “auto”关键字在C++中用于自动推导变量的类型。这是一种类型推导机制,使得...
标题中的"C/C++笔试题下载"表明这是一些与C/C++编程语言相关的笔试题目,主要针对技术开发人员,特别是C/C++工程师的面试准备。这些题目可能涵盖基础语法、数据结构、算法、内存管理、错误排查等多个方面,旨在检验...
- **指针**:C/C++中的指针是存储其他变量地址的数据类型。面试可能会问及指针的声明、赋值、解引用、空指针、野指针和指针算术。 - **引用**:引用是C++特有的特性,它是一个已初始化的别名,类似于指针,但不能...
每个源文件中的函数可以被其他源文件调用,通过函数指针或直接名称调用来实现模块间的交互。 8. **编程风格**:良好的编程风格是代码可读性和可维护性的关键。虽然规范并未强制,但遵循一定的命名规则、注释标准和...
在上面的`swap`函数例子中,程序1由于使用了值传递,实际上并未完成交换,而程序2通过传入变量的指针,成功实现了值的交换。 指针在C++中的应用广泛,包括但不限于: 1. 在函数中修改实参变量的值,就像`swap`函数...
尽管如此,`strcpy`函数依然能成功执行,因为在C/C++中,向`NULL`指针写入数据的行为虽然未定义,但通常不会导致程序崩溃。因此,`Test`函数的输出将是“hello”。 2. **Test函数**:该函数首先分配了一块内存给`...
在MATLAB中,为了提升程序执行效率,常常需要利用C或C++的高效计算能力,这就是MATLAB与C/C++混合编程的核心。本篇将详细解释如何在MATLAB中调用C程序,以及如何构建MEX函数。 首先,MATLAB本身并不包含C语言的...
在C++编程中,双指针是一种非常常见且强大的技术,尤其在处理数组、链表以及其他数据结构时。双指针的基本思想是设置两个指针,一个从数组或数据结构的头部开始,另一个从尾部开始,然后逐渐靠近,直到找到特定条件...
这篇资料主要涵盖了一些C/C++面试和笔试中常见的知识点,包括静态变量、引用与指针的区别、实时系统特性、内存管理、数据结构、算法、网络协议以及编程问题。以下是这些知识点的详细说明: 1. 静态变量: - 在函数...
【C/C++语言编程修养】是每个学习和从事C/C++编程的开发者必须关注的重要概念。良好的编程修养不仅关乎个人的技术水平,更体现了程序员的专业态度和团队合作精神。下面将详细探讨其中的关键点。 1. **有钻研精神**...
- C++编译的程序调用C编译的函数时需要使用`extern "C"`声明,这是因为C++和C的函数名约定不同。 #### 指针与内存管理 - 对于内存管理中的常见问题,如`malloc`和`free`的使用,需要注意指针的有效性以及释放内存后...
在实际编程中,指针操作可能涉及到更为复杂的概念,例如指针与函数指针、指向指针的指针、指针数组以及指向成员的指针等高级用法。学习这些高级用法是提高C++指针操作技能的重要步骤。 指针的使用需要程序员有严格...
在编程世界中,C 和 C++ 语言是基础且强大的工具,其中指针是它们的核心概念之一。指针的理解和熟练运用对于任何C/C++程序员来说都至关重要。本篇文章将根据"深入浅出C_C++指针"的主题,结合描述中的内容,为你详细...
在C++编程语言中,指针是至关重要的概念,它为程序员提供了对内存直接操作的能力,使得高级语言具有了低级语言的一些特性。本笔记将深入探讨C++指针的精髓,包括其基本概念、使用方法以及高级应用。 首先,我们要...
C/C++面试中涵盖的知识点广泛,包括语言基础、数据结构、内存管理、程序控制以及网络协议等。以下是对这些知识点的详细解释: 1. `static`关键字:`static`在C/C++中有两个主要用途。一是限制变量的作用域,使得...
在C/C++编程语言中,`static`关键字有着多种用途,主要体现在以下几个方面: 1. 限制变量的作用域:在函数内部定义的`static`变量,它的生命周期贯穿整个程序执行过程,而不是仅限于函数的一次调用。这意味着,即使...
C/C++面试题是程序员求职过程中常常遇到的挑战,这些题目旨在测试候选人的基础知识、编程技巧以及对语言特性的理解。以下是对所给面试题及其解析的深入探讨: 首先,让我们看看第一道试题: ```c void test1() { ...