1

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

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

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

4

2 回答 2

3

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

如果我弹出堆栈的顶部,将首先弹出哪个参数,num或者ptr
函数参数的评估顺序是Unspecified
所以这取决于你的编译器实现。编译器可能会评估以下参数:

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

因此,您看到的行为和顺序将取决于此。

于 2012-04-09T17:13:01.293 回答
0

除了@Als 已经提到的内容之外,x86 上的大多数编译器都遵循_cdecl从右到左评估参数的调用约定。在这里了解更多

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

于 2012-04-09T17:18:36.967 回答