C语言中调用函数指针占用哪里的存储空间,被调函数运行时内部变量存在哪里,和直接调用函数有什么区别?
如题,用函数指针调用函数时,被调函数中的局部变量是存在调用此函数指针的栈中,还是在内存中动态分配再释放?...
如题,用函数指针调用函数时,被调函数中的局部变量是存在调用此函数指针的栈中,还是在内存中动态分配再释放?
展开
展开全部
在程序运行时,一个函数占用一段连续的内存。当调用一个函数时,实际上是跳转到函数的入口地址,执行函数体的代码,完成后返回。
函数指针指向一个函数的入口地址,也就是函数存储空间的首地址。
在C语言中,数组名代表数组的首地址,同样函数名代表了函数的首地址,因此在赋值时,直接将函数指针指向函数名就行了。
因此函数指针调用vs直接调用,占用的存储空间都是一样的。相当于数组指针和数组名的关系,指向的都是同一个数组。
局部变量存在函数体里面,比如转换成8086汇编(示意):
func: 定义变量
push ax
pop ax
ret
main: call func
满意请采纳,谢谢!
函数指针指向一个函数的入口地址,也就是函数存储空间的首地址。
在C语言中,数组名代表数组的首地址,同样函数名代表了函数的首地址,因此在赋值时,直接将函数指针指向函数名就行了。
因此函数指针调用vs直接调用,占用的存储空间都是一样的。相当于数组指针和数组名的关系,指向的都是同一个数组。
局部变量存在函数体里面,比如转换成8086汇编(示意):
func: 定义变量
push ax
pop ax
ret
main: call func
满意请采纳,谢谢!
更多追问追答
追问
如果多个线程同时通过函数指针调用同一函数,调用过程是否会被打断,比如在一线程通过函数指针调用此函数时更高优先级线程转入运行状态,并通过函数指针调用同一函数,那么此函数的局部变量不会产生数据冲突吗?
追答
多个线程同时调用同一函数,调用过程不会被打断。
程序在运行期间,内存中有一块区域,用来实现程序的函数调用机制。这块区域是一块LIFO的数据结构区域,我们可以叫函数栈(调用栈)。每个未退出的函数都会在函数栈中拥有一块数据区,我们叫函数的栈帧。
因此同一个函数在不同的调用中,占用的栈帧不一样,因此同一局部变量对应不同的地址和存储空间,局部变量也就不会产生数据冲突。
我想你的疑惑点应该是来自于“未能正确认识代码段和堆栈段的关系”。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询