精华内容
下载资源
问答
  • 压栈顺序

    2013-02-11 23:58:04
    # include <stdio.h> void f(int n) { if (n == 0) return; f(n-1); printf("AAAA\n"); f(n-1); ...请问上面递归函数的压栈顺序是什么.在压的时候也把下面的aaaa和bbbb填上.
  • 一、前言 今天在看Thinking in C++这本书时,书中的一个例子引起了我的注意,具体是...C/C++中规定了函数参数的压栈顺序是从右至左,对于含有不定参数的printf函数,其原型是printf(const char* format,…);其中f
  • 函数压栈顺序

    2014-03-29 17:21:29
    函数的压栈顺序 参数N --> 栈底 ... 参数1 返回地址 局部变量1 ... 局部变量N --> 栈顶 但是,调试发现,在windows和solaris上,栈都是向下增长的,即栈底高节,栈顶低字节,而linux似乎向上增长的

    函数的压栈顺序

    参数N        --> 栈底

    ...

    参数1

    返回地址

    局部变量1

    ...

    局部变量N --> 栈顶

    但是,调试发现,在windows和solaris上,栈都是向下增长的,即栈底高节,栈顶低字节,而linux似乎向上增长的

    展开全文
  • 函数参数的压栈顺序,一般由编译器决定,不同的编译器可能规则不一样。 但是一般情况下,是从右到左。 举例 谈一谈printf()函数,printf函数的原型是:printf(const char* format,…) 没错,它是一个不定参函数...

    函数参数的压栈顺序,一般由编译器决定,不同的编译器可能规则不一样。

    但是一般情况下,是从右到左。

    举例

    谈一谈printf()函数,printf函数的原型是:printf(const char* format,…)

    没错,它是一个不定参函数,那么我们在实际使用中是怎么样知道它的参数个数呢?这就要靠format了,编译器通过format中的%占位符的个数来确定参数的个数。

    现在我们假设参数的压栈顺序是从左到右的,这时,函数调用的时候,format最先进栈,之后是各个参数进栈,最后pc进栈,此时,由于format先进栈了,上面压着未知个数的参数,想要知道参数的个数,必须找到format,而要找到format,必须要知道参数的个数,这样就陷入了一个无法求解的死循环了!!

    而如果把参数从右到左压栈,情况又是怎么样的?函数调用时,先把若干个参数都压入栈中,再压format,最后压pc,这样一来,栈顶指针加2便找到了format,通过format中的%占位符,取得后面参数的个数,从而正确取得所有参数。

    所以,如果不存在…这种不定参的函数,则参数的压栈顺序无论是从左到右还是从右到左都是没关系的。

    参考

    https://www.cnblogs.com/mini-coconut/p/9267469.html

    展开全文
  • 函数参数的压栈顺序

    千次阅读 2015-06-24 21:59:46
    对于常见的C++程序,像缺省_cdecl或使用_stdcall的函数压栈顺序都是采用的从右往左压栈的。(_pascall使用的从左往右压栈。)

    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)


    先来看一道面试题:

    设int arr[]={1,2,3,4 };

    int *ptr=arr;

    printf("%d,%d",*ptr,*(++ptr));

    面试题的答案是: 2, 2

     

    这个面试题为什么会这样呢? 原因就跟函数的压栈顺序有关,先压栈哪一个,哪一个就会被先计算,后压栈哪一个,那一个就会被后计算。

     

    对于常见的C++程序,像缺省_cdecl或使用_stdcall的函数压栈顺序都是采用的从右往左压栈的。(_pascall使用的从左往右压栈。)

     

    我个人认为从右往左压栈的好处比较明显,把第一个参数放在了栈顶,取用比较方便,另外对于可变参数而言,使用第一个参数可以确定剩余哪些输入参数需要取用。

     

    下面也是一个例子,用于进一步说明从右往左取的参数:

    void TestFunc()

    {

             int arr[] = {6, 7, 8, 9};

             int nSize = sizeof(arr)/sizeof(int);

             ViewArray(arr, nSize);

            

             int* ptr = arr;

             *(ptr++) += 1;

             ViewArray(arr, nSize);

     

             printf("result: %d, %d", *ptr, *(++ptr)); 

             printf("result: %d, %d", *(++ptr), *ptr);

    }

     

    像上面的输出为

    6 7 8 9

    7 7 8 9

    8, 8

    9, 8

     

    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)


    展开全文
  • 在C语言中,函数的压栈顺序为从右至左。示例代码: int p = 0; printf("%d %d %d \n",p++,++p,p++); 函数的执行结果是2 2 0 为什么函数的压栈顺序是从右向左呢,我们看一下printf函数的原型: printf(const ...

    在C语言中,函数的压栈顺序为从右至左。示例代码:

    	int p = 0;
    	printf("%d %d %d \n",p++,++p,p++);
    
    • 函数的执行结果是2 2 0

    为什么函数的压栈顺序是从右向左呢,我们看一下printf函数的原型:

    printf(const char* format,…)

    1. printf函数是一个不定参函数。
    2. 编译器通过format的%占位符的个数来获取参数的个数。
    3. 假设函数压栈顺序是从左至右,format先入栈,各个参数再入栈,最后pc入栈。入栈完之后,想知道参数的个数就要读取format,但要读取format就得知道参数的个数,陷入了一个死循环。
    4. 但是,如果函数压栈顺序是从右至左,未知个数的参数先入栈,format再入栈,最后压pc入栈。这时候要想知道参数的个数只需要将栈顶指针加2即可读取到format。
    展开全文
  • printf函数参数压栈顺序

    千次阅读 2015-08-26 20:51:43
    printf函数的参数的压栈顺序和求值顺序(VC++6.0编译器) 有以下程序段: 设int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)+=123; printf("%d,%d",ptr,(++ptr)); 答案为什么是:8,8 这是一道华为面试题。 ...
  • 转载。。。。 转载原文“ 要回答这个问题,就不得不谈一谈printf()函数,printf函数的原型是:printf(const char* format,…) 没错,它是一个不定参函数...现在我们假设参数的压栈顺序是从左到右的,这时,函...
  • 参数压栈顺序

    2019-07-05 15:41:40
    c/c++可变参数用法原理 最近看一些linux底层实现,随手记录点东西。 用法 没啥好说的 void foo(const char *name, …) { va_list args; char buff[1024];...va_start(args, name);...先复习下c/c++参数压栈,看...
  • c/c++的函数参数压栈顺序.  为了这句话丢了很多次人.无所谓了,反正咱脸皮厚.  总结一下: 编译出来的c/c++程序的参数压栈顺序只和编译器相关!   下面列举了一些常见的编译器的调用约定 VC6:  调用约定 ...
  • 函数压栈顺序 -- C

    千次阅读 2014-08-06 15:20:28
    压栈顺序 从右到左,从上到下压 */ int fun(int i, char * s) { /* 编译器中等同于 int a; int b; */ int a,d; printf("&s = 0x%08x\n", &s); printf("&i = 0x%08x\n", &i); printf("&f = 0x%08x\n...
  • 要回答这个问题,就不得不谈一谈printf()函数,printf函数的原型是:printf(const char* format,…) ... 现在我们假设参数的压栈顺序是从左到右的,这时,函数调用的时候,format最先进栈,...
  • printf压栈顺序

    2019-02-17 15:34:32
    其实,在处理printf时,压栈顺序为从右往左,也就是说从右往左的计算(“计算”不等于“输出”)。 在计算时,遇到x++会记录此时的x的值作为最后的输出结果。遇到x和++x的时候则不会将此时的计算结果作为最终的输出...
  • 之前研究过变参函数的实现,再看看具体printf函数的压栈顺序。 看看之前写的汇编中利用call printf来完成字符的输出.section .data output: .asciz "the processor vendor ID is '%s'\n" .section .bss .lcomm ...
  • 2 C语言参数压栈顺序? 从右到左 3 C++如何处理返回值? 生成一个临时变量,把它的引用作为函数参数传入函数内。 4 C++中拷贝赋值函数的形参能否进行值传递? 不能。如果是这种情况下,调用拷贝构造函数的时候,首先...
  • 记录C++库封装/OCX封装遇到的压栈顺序导致的问题。  事情是这样,项目中使用VC++封装了API动态库xxx.dll,此库中的所有API接口都显示声明了__stdcall,也就是说API函数压栈顺序是从右至左,栈空间的释放由函数...
  • printf从右往左入栈,x或++x只改变x的值,x++确定最后此位置的输出,x最后计算完后,x和++x位置的值都是此时x的值。 看了可能不知道啥意思,举个例子就明白了 x=1; printf("%d %d\n",x,x++); x=1;...
  • c/c++的参数压栈顺序

    2011-09-20 11:07:54
    原文地址:http://blog.csdn.net/playmud/article/details/278119 曾经看到一篇文章上面说:c/c++参数压栈顺序是从右到左,pascal参数压栈是从左到右. 为了这句话丢了很多次人.无所谓了,反正咱脸皮厚.  总结一下:
  • 上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系。... 当知道C函数的参数压栈顺序是从右到左时,我觉得很奇怪,因为大多数情况下,人
  • 函数参数压栈顺序

    千次阅读 2019-03-15 09:02:43
    大家困惑的参数压栈顺序也是调用约定的范畴,即上文所言“参数、返回值、返回地址、域指针等的存储位置”与“如何发起函数调用和调用结束后如何恢复” 既然调用约定是编译器级别的方案,那么不同编译器应该就有...
  • 栈的地址是靠偏移量来寻找的,所以参数压栈顺序,函数参数的销毁是被调函数还是主函数执行(栈的维护方式)需要约定一致,这就是调用惯例 明面上写函数test(),编译器可能实际上加了修饰字,来区分不同的调用惯例。...
  • #include <stdio.h> int main(){ int arr[] = {1,2,3,4}; int* ptr = arr; printf("%d,%d", *ptr, *(++ptr));...原因是函数的参数入栈顺序为自右向左,因此先入栈*(++ptr),再入栈 *ptr。 ...
  • 这是今天写的检查C环境的一段程序、能够判断环境的大小端、栈帧增长方向、传递参数时的压栈顺序、以及参数的求值顺序。 代码如下: #include <stdio.h> #include <assert.h> #inc...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,638
精华内容 1,455
关键字:

压栈顺序