为什么没有内存地泄漏?

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);
}
为什么没有内存地泄漏呢?

...全文
186 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
建议看一看如何写可变参数的函数。
我以前看过,但现在没有印象了:(不过里面好像有提到过这种写法的问题

15,447

社区成员

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

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