问一个问题,关于栈内存和整型函数返回值的

来源:百度知道 编辑:UC知道 时间:2024/05/21 01:57:04
有这么一个函数
int Count()
{
int i,j;
i=100;
j=200;
return i+j;
}

测试函数:
void Test()
{
int k=Count();
printf("\n k[%d]\n");
}

test()在调用函数Count之后可以打印k=300;
问一下,这个300是如何传值出来的,函数Count()结束后,系统回收栈内存,怎么还有整型数值传出来呢?应该是垃圾数据才对.
函数void Test()
{
int k=Count();
printf("\n k[%d]\n",k);
}
修改为
void Test()
{
printf("\n Count[%d]\n",Count());
}

同样也可以打印出300,说明和k的存储空间没有多大关系;函数Count()结束后肯定在某个位置保存了返回值,好像应该是在函数test()的栈内存里面吧.不太同意放在寄存器里面的说法,某一瞬间应该是放在了里面,但是最终还是要放到整型内存中去.

被调用函数的返回值放在调用函数的栈中,应该没有问题吧,也就是,在调用一个函数时,调用函数先在自己的栈中开辟一个以被调用函数返回类型为大小的空间,否则很难理解返回值放在了哪里,因为一些函数的返回值可能为一个结构体,寄存器放不下.结束问题了,虽然还是很迷惑.

C/C++的函数返回值一般是放在寄存器eax里的,而不是在栈里。

你的这一句int k = Count()的汇编语句就是这样:

mov [esp - 4], eax //eax里是300,esp - 4是局部变量k的位置

你可以在vc里做个实验:

int add(int a, int b)
{
__asm {
mov eax,a // 把参数1存入eax
add eax,b // eax += 参数2, 结果在eax里
}
}

int main()
{
printf("%d\n", add(3, 4));
return 0;
}

楼主需要了解下寄存器这一概念,我就不把C/C++函数的汇编代码给发出来了。

还有在汇编层面来看,函数的返回值根本就没有定论,函数可以通过多种方式返回。保存返回值在eax里只是C/C++的一个约定而已。

返回值可以放在栈里,但你在C的语言层面上可能做不到,其实随着函数的结束,mov esp, ebp这条指令过后,函数内部的局部变量就报废了。如果你之后没改变过栈的内容,你可以用栈来存返回值,但比起用寄存器来存储,存储和读取要慢的多。

自己突发奇想在vc下试了下用栈“返回”值,写了段代码:

#include <stdio.h>

void __declspec(naked) __stdcall return_a_value()
{
int local;
local = 1990; // 栈空间
__asm ret
}

int main()
{
int local = 1;
return_a_value(); // 用栈返回值
printf("%d\n", local);
return 0;