使用参数调用函数后的堆栈结构

时间:2012-04-09 17:09:30

标签: c memory-management

我只是在查看C中程序的内存分配。我知道所有全局变量和静态变量都存储在堆中。此外,堆栈存储所有函数调用。我在这里确实有一个疑问。假设我正在调用以下函数:

int ret;
int num = 10;
int arr[3] = {1,2,3};
int *ptr = &arr[0];
ret = giveNumber(num, ptr);

在这里,我读到函数调用giveNumer()的参数也将存储在同一个堆栈中。但它们将以什么顺序存储?如果我弹出堆栈顶部,首先会弹出哪个参数numptr

2 个答案:

答案 0 :(得分:3)

我知道所有全局变量和静态变量都存储在堆中 不,那不是真的 根据标准,它们存储在实现定义的存储区域中,通常是数据段和BSS。

如果我弹出堆栈顶部,将首先弹出哪个参数,numptr
函数参数的评估顺序为未指定 所以这取决于你的编译器实现。编译器可能会评估来自:

的参数
  • 从左到右或
  • 从右到左或
  • 任何其他随机顺序

所以行为&你看到的顺序将取决于此。

答案 1 :(得分:0)

添加@Als已经提到的内容, x86 上的大多数编译器遵循_cdecl调用约定,其中参数从右到左进行计算。在这里了解更多

http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#Standard_C_Calling_Conventions