精华内容
下载资源
问答
  • C语言函数参数入栈顺序从右到bai左是为了方便可变参数du函数。 一、在函数调用时,函数参数的传递,在C语言中是通过栈数据结构实现的。 在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用...

    C语言函数参数入栈顺序从右到左是为了方便可变参数函数。
    一、在函数调用时,函数参数的传递,在C语言中是通过栈数据结构实现的。
    在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用函数,在函数开始执行时,将参数再依次弹栈。根据栈数据结构先进后出的特点,在函数中弹栈的顺序就是从左向右的。
    二、对于参数固定的函数,无论是从左向右还是从右向左,都没什么区别,最终都是所有参数全部传递。
    三、对于可变参数,比如printf,会在第一个参数格式字符串中,指明后续有几个参数,各自是什么类型的。于是在函数中,参数格式字符串必须第一个弹栈,否则无法获取参数类型,也就无法获知后续参数占几个字节,导致无法正确获知参数。
    四、理论上来说,如果从左向右压栈,可变参数标记格式字符串的参数放在最后,那么也是可以的。 不过最早设计C语言的人采用了这种方式,后续也就延续下来了。

     

    源链接:https://zhidao.baidu.com/question/628286190320666284.html

    展开全文
  • printf函数参数入栈问题,从右向左入栈。

    首先,我们来看一个问题,假设在一个32为小端机器上运行下面程序,结果是什么

    #include <stdio.h>
    
    int main(){
    	long long a = 1, b = 2, c = 3;
    	printf("%d %d %d\n", a, b, c);
    	
    	return 0;
    }
    

    下面我们直接运行一下,来看一下结果
    在这里插入图片描述
    我们可以看到运行结果是1、0、2,这是为什么呢
    这是因为printf函数不是将参数分开压栈,而是一股脑全部压栈,而printf压栈的顺序是从右向左的,所以堆栈中的数据应该是:1000、0000、2000、0000、3000、0000。而**%d是按四个字节输出**,所以第一个%d输出1,第二个%d输出0,第三个%d输出2

    • 我们调试一下程序,查看反汇编
      在这里插入图片描述
      可以看到参数压栈顺序确实是从右向左
    • 下面,我们来画一下大概的入栈出栈示意图
      在这里插入图片描述

    如果我们不把a、b、c放在一个printf函数中就不会有这个问题,分开打印,结果就是1,2,3

    #include <stdio.h>
    
    int main(){
    	long long a = 1, b = 2, c = 3;
    	printf("%d\n", a);
    	printf("%d\n", b);
    	printf("%d\n", c);
    
    	return 0;
    }
    

    运行结果如下
    在这里插入图片描述

    展开全文
  • 判断函数参数入栈顺序的一个参数代码如下: void f(int i, int j, int k); int main(void) { int a = 1, b =2, c = 3;  f(a,b,c); return 0; } void f(int i, int j, int k) { int h; int g; printf("k...

    判断函数参数入栈顺序的一个参数代码如下:

    void f(int i, int j, int k);
    int main(void)
    {
    int a = 1, b =2, c = 3; 
    f(a,b,c);
    return 0;
    }
    void f(int i, int j, int k)
    {
    int h;
    int g;
    printf("k:%x\n",&k);
    printf("j:%x\n",&j);
    printf("i:%x\n",&i);
    printf("h:%x\n",&h);
    printf("g:%x\n",&g);
    }

    //C程序中,栈底为高地址,栈顶为低地址

    如果f函数中,三个变量所分配地址顺序为k-->i和h-->g的顺序相同,说明函数的入栈顺序是从右向左;

    展开全文
  • 对技术执着的人,比如说我,往往对一些问题,不仅想做到“知其然”,还想做到“知其所以然”。...某天某地某人问我,C语言中函数参数入栈顺序如何?从右至左,我随口回答。为什么是从右至左呢?我终究没有给

    http://blog.csdn.net/liangkaiming/article/details/6230779

    对技术执着的人,比如说我,往往对一些问题,不仅想做到“知其然”,还想做到“知其所以然”。C语言可谓博大精深,即使我已经有多年的开发经验,可还是有许多问题不知其所以然。某天某地某人问我,C语言中函数参数的入栈顺序如何?从右至左,我随口回答。为什么是从右至左呢?我终究没有给出合理的解释。于是,只好做了个作业,于是有了这篇小博文。

    #include <stdio.h>

    void foo(int x, int y, int z)
    {
            printf("x = %d at [%X]/n", x, &x);
            printf("y = %d at [%X]/n", y, &y);
            printf("z = %d at [%X]/n", z, &z);
    }

    int main(int argc, char *argv[])
    {
            foo(100, 200, 300);
            return 0;
    }

    运行结果: 
    x = 100 at [BFE28760]
    y = 200 at [BFE28764]
    z = 300 at [BFE28768]

    C程序栈底为高地址,栈顶为低地址,因此上面的实例可以说明函数参数入栈顺序的确是从右至左的。可到底为什么呢?查了一直些文献得知,参数入栈顺序是和具体编译器实现相关的。比如,Pascal语言中参数就是从左到右入栈的,有些语言中还可以通过修饰符进行指定,如Visual C++。即然两种方式都可以,为什么C语言要选择从右至左呢?

    进一步发现,Pascal语言不支持可变长参数,而C语言支持这种特色,正是这个原因使得C语言函数参数入栈顺序为从右至左。具体原因为:C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底。除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数。这样就变成了左边参数的个数不确定,正好和动态参数个数的方向相反。

    因此,C语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式,C语言中可变参数都是从左到右,所以不管你有多少个参数反正将最右面的那个压入栈底,最左面的参数出入栈顶。换句话说,如果不支持这个特色,C语言完全和Pascal一样,采用自左向右的参数入栈方式。


    参考scanf(char *p, int x, ...)函数,最左边参数在栈顶,压完后就能知道其首地址,通过解析这个参数的内容,就可以解析出后面所有的参数;反过来的话,就无法获知最左边参数的首地址了。


    展开全文
  • (转)C语言中函数参数压栈顺序小结先看一个小程序:#include &lt;stdio.h&gt;int f(int i, int j, int k) { printf(&quot;%d at [%X]\n%d at [%X]\n%d at [%X]\n&quot;, i, &amp;i, j, &amp...
  • 由该文章知道计算机中栈的生长方向为由高到低,及栈底为高地址,栈顶为低地址,因此函数输入参数入栈顺序可以由栈地址大小判断,地址大的先入栈,地址小的后入栈 #include void Var_Order(int x, int y, int z) ...
  • 栈帧在函数调用时进行构建,以进行内存的隐式分配。内存可以显示的通过malloc(), calloc(), realloc(), new, free和delte在堆上进行申请和释放。不同的操作系统的栈帧布局可能不同,一个典型的栈帧布局如下所示:
  • 其实如果函数参数固定的话,比如void func(int a, int b, int c)的入栈顺序从右到左还是从左到右怎么都行,只不过在调用不定个数参数函数时使用从左到右压站就麻烦了。比如printf(“%d-%d-%d\n”,a,b,c);printf...
  • 进一步发现,Pascal语言不支持可变长参数,而C语言支持这种特色,正是这个原因使得C语言函数参数入栈顺序为从右至左。具体原因为:C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,...
  • 函数参数入栈顺序,参数计算顺序以及可变参数的实现
  • C语言中函数参数入栈顺序 先通过一个小程序来看一看: #include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at [%X]n", z, &z); } ...
  • 参数入栈顺序 c++提供了5种参数传递标准,除了main函数传递必须用_cdecl模式,其他函数可以自己在编译器设置,默认的是_cdecl模式,即从右到左入栈 参数计算顺序 参数的入栈和计算顺序并不是一回事,c++标准并未指定...
  • 主要介绍了C语言中函数参数入栈顺序详解及实例的相关资料,需要的朋友可以参考下
  • C语言中函数参数入栈顺序的确是从右至左的,一个例子来证明:#include void func(int x, int y, int z) { printf("x = %d at [%X]\n", x, &x); printf("y = %d at [%X]\n", y, &y); printf("z = %d at [%X]\n",
  • 关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥如果大家细心的话应该知道c/c++语言函数参数入栈顺序为从右至左,那么为什么这样呢?来看看两个知识点:参数的计算顺序与压栈顺...
  • 看到面试题C语言中函数参数入栈顺序如何? 自己不知道,边上网找资料。下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){ printf("x = %d at [%X]/n", x, &x); printf("y = %d at ...
  • C语言函数参数入栈顺序为从右至左。具体原因为:C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底。除非知道参数个数,否则是无法...
  • C语言中函数参数入栈顺序 先通过一个小程序来看一看: #include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,251
精华内容 12,500
关键字:

函数参数的入栈顺序