为什么没有内存地泄漏?

hello_wyq 2001-05-26 09:06:00
void main(void)
{
int a = 1;
int b = 2;
int c = 3;
printf("%d,%d",a,b,c);
}
为什么没有内存地泄漏呢?

...全文
288 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ed9er 2001-05-27
  • 打赏
  • 举报
回复
对kingfox的一点小补充,从MSDN里拷出来的

__cdecl
This is the default calling convention for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions. The __cdecl calling convention creates larger executables than __stdcall, because it requires each function call to include stack cleanup code.


__stdcall
The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype.

里面的vararg就是可变参数函数中需要使用到的移栈指针的宏
如果不用混合语言写代码的话,缺省情况下是__cdecl,也就不必管那么多,你最上面的那种写法一点问题没有
iZap 2001-05-27
  • 打赏
  • 举报
回复
kingfox(小狐仙)
明白,谢谢,我倒是无所谓编译出来的汇编代码,这些不大用得着关心,总之谢了.
狐帝 2001-05-27
  • 打赏
  • 举报
回复
C/C++之所以支持变参数,就是因为这个道理。
狐帝 2001-05-27
  • 打赏
  • 举报
回复
看来需要解释一下C/C++的函数调用规范:C/C++中,调用函数的代码负责将函数的参数自右向左逐个压入堆栈,被调用函数根据需要从堆栈中获取参数值。但是,注意:被调用函数并不负责将参数出栈,从堆栈中取消参数的工作是由“调用者”完成的。所以,调用函数的伪代码应该是:

调用者:
push c
push b
push a
call func
sub sp, 3 ;在这里将入栈的参数清除。


iZap 2001-05-27
  • 打赏
  • 举报
回复
我的猜想:
无论压栈量是多少,可变参数的函数返回前都会把栈指针改回到入栈前的状态,这种做法并不神秘.

伪代码,如调用调用func(a,b,c)
mov [XXXX],sp;保存栈指针
push c
push b
push a
call func

func(a)的处理过程
pop a
;pop b 就算不做这一步
;pop c 就算不做这一步
...;处理后返回...
mov sp,[XXXX];改回原来的栈指针,这一步就做足够了
ret

当然编译器不是用我说的这种方法,
但我是这样理解可变参数函数的原理的,很简单也挺直白.
liu_feng_fly 2001-05-27
  • 打赏
  • 举报
回复
第三个参数被忽略了,呵呵,我想是这样
hello_wyq 2001-05-27
  • 打赏
  • 举报
回复
那么第三个变量是不是也要压入栈中呢?
如果是的话,它是不是可能不会POP呢?

iZap 2001-05-27
  • 打赏
  • 举报
回复
或者不是全局保存,把将要的压栈量也一起压入栈内传给被调用者也行.
iZap 2001-05-27
  • 打赏
  • 举报
回复
其实我想
如果运行时能有个方法告知被调用者压栈量,然后被调用者正确的弹出压栈数,返回前能正确修改栈指针.如我上面的假想,来个全局保存,应该比较灵活,只是这个全局保存不大安全也不好做而已.
狐帝 2001-05-27
  • 打赏
  • 举报
回复
如果采用C/C++方式调用的话,调用者压入堆栈的参数个数可以多于被调用函数需要的参数个数,多余的参数最多是浪费掉。但是不能少于被调用函数需要的参数个数,否则会出现不可预计的错误。
tomchen1 2001-05-26
  • 打赏
  • 举报
回复
printf好像是用格式控制符来控制输出的,你前面部分是“%d,%d”,printf就根据控制符来对应选择变量,第三个变量没有控制符和他对应,因而不会输出,所以不会出问题
cber 2001-05-26
  • 打赏
  • 举报
回复
我看的是codeproject上面的一篇文章
hello_wyq 2001-05-26
  • 打赏
  • 举报
回复
cber:
那本书?

cber 2001-05-26
  • 打赏
  • 举报
回复
建议看一看如何写可变参数的函数。
我以前看过,但现在没有印象了:(不过里面好像有提到过这种写法的问题
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

15,446

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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