c语言中,函数发生调用时,实参和形参都会占用内存吗

天才2012 2012-11-15 05:23:45
编译器linux下面的gcc,
#include <stdio.h>
int fun(int a);
void main()
{
int a=1;
fun(a);
printf("%d\n",fun(1));

printf("%d\n",a);
}

int fun(int a)
{
//a=3;
a=a+1;
return a;
}
这个行参占不占内存,问问
...全文
6624 116 打赏 收藏 转发到动态 举报
写回复
用AI写文章
116 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenxitwo 2015-05-13
  • 打赏
  • 举报
回复
每个函数都有它的栈空间,这个实在函数调用时分配的(在跳转到函数入口地址之前,操作栈指针实现)。局部变量全部是在栈空间上的,调用函数时,将实参按照参数列表的从右至左的顺序,最后将下一条指令的地址压栈。在函数返回是会弹栈,也就是回收了这个函数的局部变量(包括形参),但这个回收是指这部分栈空间可以给本进程的函数使用,不能分配给进程。在fork一个进程是,就已经分配了他的栈空间,这个进程的栈空间只有在这个进程被kill掉时,才会回收给系统。
chenxitwo 2015-05-13
  • 打赏
  • 举报
回复
沉了?????
小九格物 2014-04-25
  • 打赏
  • 举报
回复
看了大家的留言,备受启发,倍感压力和动力!
漫宇叶 2013-12-12
  • 打赏
  • 举报
回复
个人认为:形参在函数被调用时开辟一个内存单元,用于存放各种数据类型:int,char……当然还有重要的地址类型(4个字节),当实参为数组、函数的时候(他们都有自己的内存,不同于形参内存),往往把他们的首地址传给形参,形参这时候有4个字节的内存单元,用于存放实参的传来的地址。当实参为int,形参开辟内存单元(不同于实参内存),用于存放实参传来的值,此时,函数只对形参的内存进行操作,不操作实参。看一个例子:void fun(int a[100]){},这个函数在被调用时为形参开辟内存,多大?其实只有四个4字节,因为形参的内存只要存放实参数组的首地址就够了,无需存放整个数组,再这里形参实质上就是一个指针。形参是函数,结构体等,都是一个道理。
hyfcomeon 2012-12-09
  • 打赏
  • 举报
回复
函数在被调用的时候,会给自己的形参分配一个内存空间,然后接收实参,否则把实参接收到哪呢??
superzxn0705 2012-11-22
  • 打赏
  • 举报
回复
引用 58 楼 gzzaigcn 的回复:
引用 55 楼 superzxn0705 的回复:对于普通变量来说,其实没什么大问题,对于传递值来说确实要为形参分配一个临时内存,但这种操作无关紧要。 有一个方法可以证明,如果传递一个类进去的话,你会发现如果值传递,会调用拷贝构造函数,意味着分配了内存,并且在结束调用的时候释放它。 C/C++ code?12345678910111213141516171819202……
实参
okletsgo007 2012-11-21
  • 打赏
  • 举报
回复
楼主这孩子不地道啊,这么多热心的朋友也不给个分意思意思,╮(╯▽╰)╭
skylkj 2012-11-19
  • 打赏
  • 举报
回复
这也能讨论这么久………… 调用函数的时候形参压栈,栈不是内存啊?实参的值被复制到形参所在栈的内存空间。函数调用完栈被释放。

int fun(int a)
{
	printf("fun a address:%d\r\n",(int)&a);
	a++;
	return a;
}


void main(void)
{
	int a = 10;
	printf("main a address:%d\r\n",(int)&a);
	a = fun(a);
	return;
}
自己看下内存地址了。而且楼主自己贴的汇编里面fun函数一开始也有push压栈操作,还有什么好纠结的?
gcfhgfhjgj 2012-11-18
  • 打赏
  • 举报
回复
好像楼主没有看懂汇编吧 movl 28(%esp),%eax // 将实参复制到 寄存器eax中 28(%esp)是存实参的地方 movl %eax, (%esp) // 将eax的值复制到堆栈中 ,(这个堆栈中存的就是形参的值) call f() // 调用函数的时候先将参数压栈 自己 用gdb 看 从楼主对函数的参数认识,可能对指针的认识也不够吧
#blackheart 2012-11-18
  • 打赏
  • 举报
回复
大多语言的分配方式有:静态分配、基于栈的分配、堆分配。 后两种常见,第一种在早期的高级语言里才有,由于其局限性现在几乎没有这种方式了,即使有也是作为辅助策略出现了。 C是基于栈、堆的分配策略,形参就是子程序的局部变量,所以自然会压入栈,至于你看到编译后的汇编中没有,那只是编译器的优化导致,并不意味着不分配“内存”。因为寄存器不也是内存吗? 假如,没有在内存中,你如何操作它?我觉得你纠结的是它有没有分配到你的内存条的特指内存块吧,把编译优化选项关掉,再看看结果。 给你推荐一本书程序设计语言:实践之路(第二版:裘宗燕译)
天才2012 2012-11-17
  • 打赏
  • 举报
回复
引用 96 楼 gz_qmc 的回复:
你要学习汇编和基础原理,你根本不用问这问题 你要不学习汇编和基础原理,讨论这问题毛的用都没有 你注意力的方向,就是你前进的反向 所以我断言,你在C语言程序设计方面将无所作为
说对了啊,哈哈,我底层的玩的比较多
天才2012 2012-11-17
  • 打赏
  • 举报
回复
引用 94 楼 zhaowech 的回复:
引用 93 楼 gzzaigcn 的回复:貌似你的理解不对,而且这个1和2这块内存不是函数结束就释放 C/C++ code?12345678910111213141516#include <stdio.h>void swap(int a,int b){ int temp; temp=a; a=b; b=temp; printf("swap中……
你这都市废话
孤影品茗 2012-11-17
  • 打赏
  • 举报
回复
引用 93 楼 gzzaigcn 的回复:
貌似你的理解不对,而且这个1和2这块内存不是函数结束就释放

#include <stdio.h>
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
printf("swap中的%x\n",&a);
}

int main()
{
int a=1,b=2;
swap(a,b);
printf("main中的%x\n",&a);
}


不上图还说不清楚了,main函数中定义的a、b有main函数结束后释放,swap中的a、b在swap结束后释放,各自释放各自定义的局部变量,明显可以看到main中的a地址和swap中的不同,所以swap在调用时重新了开辟了内存啊a、b(它们的值和main中的完全相等),只不过在swap结束后又释放了,swap中的a、b的值确实交换了,但不是main中的交换了,够清楚了么?
wc72519 2012-11-17
  • 打赏
  • 举报
回复
孩子 。。你想多了。。太较真了
志强 2012-11-17
  • 打赏
  • 举报
回复
形参属于局部变量,局部变量的生存期从函数调用开始,到函数调用结束。
lin5161678 2012-11-17
  • 打赏
  • 举报
回复
引用 96 楼 gz_qmc 的回复:
你要学习汇编和基础原理,你根本不用问这问题 你要不学习汇编和基础原理,讨论这问题毛的用都没有 你注意力的方向,就是你前进的反向 所以我断言,你在C语言程序设计方面将无所作为
和汇编没关系 在这里纯干扰而已 形参是函数内的局部变量知道这一点就知道形参占内存 实参 有时候是一个常量 有时候是一个函数返回值 这些倒是没内存
lin5161678 2012-11-17
  • 打赏
  • 举报
回复
引用 93 楼 gzzaigcn 的回复:
引用 92 楼 zhaowech 的回复: 看楼上讨论的那么火热,我也发表看法吧 由于本贴只讨论局部变量,所以好理解很多,局部变量都是存储在栈里的,它在自己定义自己的函数体内起作用,一旦函数结束,就被释放,所以它们也是要占内存的,调用函数时,分配内存,函数调用完毕,释放内存。 至于swap的无法交换是因为,你如果不是传地址或者引用的话,在使用形参是,系统会将形参的值每个复制一份到内存中,再使……
汗 实参根本没内存 常量1, 2 也没内存 何来的操作1,2的内存
gz_qmc 2012-11-17
  • 打赏
  • 举报
回复
你要学习汇编和基础原理,你根本不用问这问题 你要不学习汇编和基础原理,讨论这问题毛的用都没有 你注意力的方向,就是你前进的反向 所以我断言,你在C语言程序设计方面将无所作为
天才2012 2012-11-17
  • 打赏
  • 举报
回复
引用 105 楼 ylcrow 的回复:
arm平台,形参不 引用 53 楼 wangqiang1101 的回复:不调用函数是不占内存的,调用时才分配内存调用完立即释放,什么叫形式参数 就是用的时候拿来用 不用就挂着占代码空间 不占内存的 老师就这样说的!函数内部的参数返回时会被释放,但是形参的空间位于上一个栈帧中,除非上一个函数返回,不然形参会一直存在。不过有些平台(arm)参数较少时直接使用寄存器……
你这个和我想的一样,上个函数不返回,这个行参就存在,这个的函数调用约定决定的,
yangxiliangfj 2012-11-17
  • 打赏
  • 举报
回复
在变量的生命周期内都占内存的,形参和实参都一样有生命周期的,如果是引用类型的话,存放的是地址,也就是说也是占内存的
加载更多回复(93)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧