我只是在查看C
中程序的内存分配。我知道所有全局变量和静态变量都存储在堆中。此外,堆栈存储所有函数调用。我在这里确实有一个疑问。假设我正在调用以下函数:
int ret;
int num = 10;
int arr[3] = {1,2,3};
int *ptr = &arr[0];
ret = giveNumber(num, ptr);
在这里,我读到函数调用giveNumer()
的参数也将存储在同一个堆栈中。但它们将以什么顺序存储?如果我弹出堆栈顶部,首先会弹出哪个参数num
或ptr
?
答案 0 :(得分:3)
我知道所有全局变量和静态变量都存储在堆中 不,那不是真的 根据标准,它们存储在实现定义的存储区域中,通常是数据段和BSS。
如果我弹出堆栈顶部,将首先弹出哪个参数,num
或ptr
函数参数的评估顺序为未指定
所以这取决于你的编译器实现。编译器可能会评估来自:
所以行为&你看到的顺序将取决于此。
答案 1 :(得分:0)
添加@Als已经提到的内容, x86 上的大多数编译器遵循_cdecl
调用约定,其中参数从右到左进行计算。在这里了解更多
http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#Standard_C_Calling_Conventions