对形参在内存中存在状态的疑问

hanyj_3000 2010-01-31 10:49:06
void test1(int k)
{
k = 10;
}

void test2(int *kk)
{
*kk = 100;
}

void main()
{
int i = 0;
int *ii = &i;

test1(i);
test2(ii);
}
请问两个被调用函数test1和test2的形参 int k和int kk,系统有没有在内存里面开辟有内存存放这两个形参?
形参int K在test1被调用结束后应该在内存不存在了,那int *kk指针KK在test2被调用结束后在内存中是不是还存在?
...全文
209 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-02-01
  • 打赏
  • 举报
回复
VC6调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
gelu1040 2010-02-01
  • 打赏
  • 举报
回复
形参和函数内部定义的参数一样,只是被实参初始化过而已.
把形参看成函数内部的局部变量就对了.


建鼎呓语 2010-02-01
  • 打赏
  • 举报
回复
堆栈在程序运行时分配,在程序结束时释放,不会随调用函数返回等销毁。
建鼎呓语 2010-02-01
  • 打赏
  • 举报
回复
针对上述回复中统一出现的 形参在调用后内存不存在了这个说法 进行辟谣

形参在调用时压入在堆栈中,调用结束之后,这个内存还是在那里,不过他的值就是不确定的了

pengzhixi 2010-02-01
  • 打赏
  • 举报
回复
请问两个被调用函数test1和test2的形参 int k和int kk,系统有没有在内存里面开辟有内存存放这两个形参?
有,在函数被调用的时候就会在函数调用栈里面为他们开辟

形参int K在test1被调用结束后应该在内存不存在了,那int *kk指针KK在test2被调用结束后在内存中是不是还存在?

函数调用结束,函数栈已经销毁,自然就不存在了。
iamliadai 2010-02-01
  • 打赏
  • 举报
回复


[Quote=引用 11 楼 tianweishuiguo 的回复:]
C语言中都是按名传递的,所以那使传递指针,也是将形参指向实参的位置,他们是两个变量
[/Quote]


你的头像牛逼吗
iamliadai 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 m0521 的回复:]
C 语言的参数 传递 2种方式

1. 寄存器
2. 堆栈

每种平台不一样
[/Quote]

up
suchx 2010-02-01
  • 打赏
  • 举报
回复
是改变任何外部的值。
suchx 2010-02-01
  • 打赏
  • 举报
回复
其实编译器优化的好,第一个调用是可以直接优化掉的,因为它没有往外面传递任何的值。
traceless 2010-02-01
  • 打赏
  • 举报
回复
呵呵 这个问题要看怎么说了

更贴切的说:
有的系统对于函数变量(包括形参和函数内部声明的变量)不多的不需要开辟内存(栈)的。

jack_wq 2010-02-01
  • 打赏
  • 举报
回复
upup
suchx 2010-02-01
  • 打赏
  • 举报
回复
怎么说呢,C语言是调用者负责平衡栈,所以调用结束后参数K依然存在,理论上用[esp]也能访问。但再调用者平衡栈之后,对K访问就没有意义了。
xjw163 2010-01-31
  • 打赏
  • 举报
回复
书上说栈的空间只有2M,那我一个函数有1M个参数,程序岂不崩溃了?求解!
cattycat 2010-01-31
  • 打赏
  • 举报
回复
第一个有,第二个 不存在。
形参是在函数调用的栈上分配的,所以函数退出后,就被释放了。用指针当形参,实际上指向实参的位置,所以能改变变量的值。
十八道胡同 2010-01-31
  • 打赏
  • 举报
回复
请问两个被调用函数test1和test2的形参 int k和int kk,系统有没有在内存里面开辟有内存存放这两个形参?
------------


形参int K在test1被调用结束后应该在内存不存在了,那int *kk指针KK在test2被调用结束后在内存中是不是还存在?

--------------
不存在
macrojj 2010-01-31
  • 打赏
  • 举报
回复

请问两个被调用函数test1和test2的形参 int k和int kk,系统有没有在内存里面开辟有内存存放这两个形参?
调用的时候 才有
形参int K在test1被调用结束后应该在内存不存在了,那int *kk指针KK在test2被调用结束后在内存中是不是还存在?
也不存在了啊
yuanmoren 2010-01-31
  • 打赏
  • 举报
回复
形参放在栈中的,函数调用结束之后就不存在了
水源木本 2010-01-31
  • 打赏
  • 举报
回复
可以做一个测试,在test1和test2中定义局部变量,将地址返回给main函数,等函数返回之后再通过地址来访问,看看会有什么发现?
飞天御剑流 2010-01-31
  • 打赏
  • 举报
回复
请问两个被调用函数test1和test2的形参 int k和int kk,系统有没有在内存里面开辟有内存存放这两个形参?
---------------------------------------------------------------
当然有


形参int K在test1被调用结束后应该在内存不存在了,那int *kk指针KK在test2被调用结束后在内存中是不是还存在?
--------------------------------------------------------------------------------
不存在。
东大坡居士 2010-01-31
  • 打赏
  • 举报
回复
C语言中都是按名传递的,所以那使传递指针,也是将形参指向实参的位置,他们是两个变量
加载更多回复(4)
abstract class 抽象类 accelerator 快捷键 accelerator mapping 快捷键映射 accelerator table 快捷键对应表 access modifier 访问修饰符 Access Pack 访问包 access specifier 访问说明符 access violation 访问冲突 accessibility 辅助功能 accessibility domain 可访问域 Accessibility Options 辅助功能选项 accessor 访问器 action 操作 Active Directory hierarchy Active Directory 层次结构 active document 活动文档 Active Document Containment 活动文档包容 active end 活动结尾 active object 活动对象 active point 活动点 Active Template Library 活动模板库 ActiveX Component ActiveX 组件 ActiveX Control ActiveX 控件 ActiveX control container ActiveX 控件容器 ActiveX Control Interface Wizard ActiveX 控件接口向导 ActiveX Control Test Container ActiveX 控件测试容器 ActiveX Designer ActiveX 设计器 ActiveX Document Migration Wizard ActiveX 文档移植向导 ActiveX-enabled 支持 ActiveX 的 Add key/ Multiply key/ Substract key/ Devide key 加号键/ 乘号键/ 减号键/ 除号键 Add-In 外接程序 Address Book 通讯簿 address space 地址空间 Administrator Mode 管理员模式 advise sink 通知接收 aggregate 聚合 Airbrush 喷枪 All Tables 所有表 allocation hook 分配挂钩 Alternate text "替换文字,备用文本" Always On Top 总在最前面 ambient 环境 ambiguous 不明确 ampersand “&”符 ampersand (&) “and”符 (&) anchor 锚定 (v.);定位点 (n.) animation control 动画控件 apartment-model threading 单元模型线程 application framework 应用程序框架 Application Wizard 应用程序向导 Apply Now 立即应用 apply to similar 应用到相似项 argument 参数 Arrange Tables 排列表 array initializer 数组初始值设定项 array rank 数组秩 arrow cap 箭头帽 ARROW key 箭头键 ArrowHourGlass 箭头沙漏 ArrowQuestion 箭头问号 article family 文章族 assembly 程序集;汇编 assembly manifest 程序集清单 assert 断言 assign 分配 associate 关联 asterisk (""*"") 星号(“*”) asynchronous moniker 异步名字对象 asynchronous peek operation 异步查看操作 ATL Object Wizard ATL 对象向导 atomic operation 原子操作 attached table 附加表 attribute 属性 Attributed Component Wizard 属性化组件向导 Attributed Programming 属性化编程 Attributes Property Attributes 属性 Authentication 身份验证 authorable 可创作(的) Auto completion for commands 自动完成命令 Auto Increment 自动增加 Auto Syntax Check 自动语法校验 Automatic 自动 automation 自动化 automation-enabled 启用自动化

70,026

社区成员

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

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