[C/C++]参数栈传递

假设在32位环境中,CPU为小端模式,所有参数有栈传递,则执行以下程序,结果是 ?

int main(int argc, char** argv) {

    long long a=1,b=2,c=3;

    printf("%d,%d,%d",a,b,c) ;

    return 0;

}

 

long long 是 8字节, int 是4字节,printf函数实参入栈顺序是从右往左压入栈中,输出时从栈顶开始读取实参。

其实个中原来是与操作系统的中断有关的,在主函数调用printf发生中断,需要把现场参数存好,然后去寻找printf的入口地址,找到之后返回,然后把实参放入printf函数中,因为放入参数时是从左往右,所以入栈时就从右往左,取的时候就是从左往右了。压入栈后为,左边为栈顶,右边为栈底,存储格式为小端模式

0x0100000000000000,0x1000000000000000,0x1100000000000000

读取之后,printf时按照形参%d,%d,%d来读取的,就是说每一次读取4个字节来作为一个整型,所以读取后的三个参数为0x01000000,0x00000000,0x10000000,对应就是1,0,2

输出就是1,0,2

注意,这里假设了所有函数都是栈传递的,但是事实上并非如此,有些函数就不是栈传递了,譬如自定义一个

int max_(int a, int b){

    return a > b ? a: b; 

}
int main(int argc, char** argv) {

    long long a=1,b=2,c=3;

    max_(a,b);

    return 0;

}

调用max依然能够返回正确的结果。

 

参考文献:

王道程序员求职宝典

 


本文基于知识共享署名-非商业性使用 3.0 许可协议进行许可。欢迎转载、演绎,但是必须保留本文的署名林羽飞扬,若需咨询,请给我发信</a

你可能感兴趣的:(c/c++)