首页 > 试题广场 >

阅读如下C++程序,请问刚进入func函数时,参数在栈中的形

[单选题]
如下C++程序
int i=0x22222222; 
char szTest[]="aaaa";  //a的ascii码为0x61 
func(I, szTest);    //函数原型为void func(int a,char *sz);
请问刚进入func函数时,参数在栈中的形式可能为 (左侧为地址,右侧为数据—)

  • 0x0013FCF0	0x61616161				
    0x0013FCF4	0x22222222				  
    0x0013FCF8	0x00000000
  • 0x0013FCF0	0x22222222
    0x0013FCF4	0x0013FCF8
    0x0013FCF8	0x61616161
  • 0x0013FCF0	0x22222222				
    0x0013FCF4	0x61616161				
    0x0013FCF8	0x00000000
  • 0x0013FCF0	0x0013FCF8
    0x0013FCF4	0x22222222
    0x0013FCF8	0x61616161
选D。  1,对于x86,栈的增长方向是从大地址到小地址
            2,对于函数调用,参数的入栈顺序是从右向左
            3,函数调用入栈顺序是  右边参数-->左边参数-->函数返回地址
符合的只有D
C明显不对,即使栈增长方向是从小地址到大地址,0x00000000也明显不是函数返回地址
发表于 2015-09-04 11:46:12 回复(13)

szTest I func  依次入栈 地址由高到低
Var
func
I
szTest
Addr
0x0013FCF0
0x0013FCF4
0x0013FCF8
数组首地址
Value
0x0013FCF8
0x22222222
0x61616161

编辑于 2022-09-12 11:19:45 回复(0)
答案:D
       需要注意两点: 
              第一是函数参数的入栈顺序,从右到左;
              第二是栈的存储是从高地址到低地址。
    
发表于 2015-09-04 15:24:06 回复(0)
0x0013FCF0    0x0013FCF8
0x0013FCF4    0x22222222
0x0013FCF8    0x61616161
看选项D。
AC很容易排除掉,因为函数返回的地址是不正确的~
发表于 2018-09-01 20:00:24 回复(2)
函数调用,入栈是右边参数、左边参数,然后函数返回地址。
栈是由高地址向地地址增长。
PS:排版真是差

选D
编辑于 2015-09-04 14:50:31 回复(0)
栈:一种数据结构,是特殊的线性表,遵从"先进后出"原则。 栈只能在一端进行插入(进栈)和删除(出栈)操作,此端称为栈顶,也是最低地址。栈顶指针指向栈中最后一个元素的下一地址。 函数入栈顺序是,先右边参数,再左边参数,最后函数返回地址。所以右边参数(即字符串"aaaa")先入栈,为栈底,地址数最大(高地址),再到左边参数,最后到函数地址。 答案为D。
发表于 2022-05-13 02:55:42 回复(0)

1.对于C语言来说,入栈总是从高地址向低地址入

2.函数调用,参数入栈从右向左放入,然后再放入局部参数,注意静态变量不入栈

3.最后,要保存一个函数返回地址,所谓函数返回地址,即此函数执行完毕后要执行的下一条语句的地址

发表于 2018-08-11 10:26:32 回复(0)
C 字符串末位有个\0,字符一个字节,整形四个字节,从左往右压栈
发表于 2015-09-03 17:38:50 回复(0)
c++问题怎么老是出现在java题目中啊,我明明选的是java方向啊啊啊啊啊啊!!!!!C++大法虽然很好,但是我不熟悉啊。。。
发表于 2019-06-30 11:04:17 回复(1)
看不懂,原谅我
发表于 2023-07-22 12:23:32 回复(0)
刚开始没看懂题目 看懂左侧是地址 右侧是数据就好懂了 手机查看排版问题很大 影响分析。根据栈的数据排列从右到左 地址依次递增 参数位置对应上就好了
发表于 2022-04-24 18:31:29 回复(0)
一图流解说:
0x0013FCF0               0x0013FCF8 (指向函数地址)
0x0013FCF4               0x22222222 (指向数据:最左边的参数)
0x0013FCF8 (函数地址)    0x61616161 (指向数据:最右边的参数)
注意,执行顺序是从0x0013FCF0 开始的。
编辑于 2021-08-12 20:54:41 回复(1)
第一是函数参数的入栈顺序,从右到左; 第二是栈的存储是从高地址到低地址。
发表于 2022-07-18 15:35:09 回复(0)
这个题,我买的书上有个选项
0x0013FCF0   0x61616161
0x0013FCF4    0x22222222
0x0013FCF8    0x0013FCF8
是不是也对?
1> 栈增长由小到大
2> 函数调用入栈从右向左
编辑于 2021-12-20 17:23:27 回复(1)
函数参数入栈顺序是从右向左
发表于 2020-07-26 14:21:55 回复(0)
函数入栈顺序为右边参数,左边参数,函数地址。另外注意栈中的地址是由高向低的。
发表于 2019-07-10 09:20:19 回复(0)
函数调用的时候,实参的入栈顺序是从右到左;
而栈地址的增长方向从高到低;

发表于 2019-03-26 09:13:27 回复(1)
1.这个题要两个两个数据一起看,结合题目,左边为地址,右边为数据。
2.函数调用是从最右边参数开始,最后再到函数调用返回的地址。(从大地址到小地址)
3.然后在栈里看就是,所以第一个就是    函数调用的地址+值  参数I的地址+值  最右边参数+值,
发表于 2023-07-11 21:38:27 回复(0)
注意是 栈 从右往左一次入栈 0x61616161先入 因为是个指针不改变地址 0x22222222再入 因为不是指针所以给局部变量分配地址0x0013FCF8
发表于 2022-02-01 08:44:42 回复(0)
感觉好像都有问题,call调用函数时会先push arg2再push arg1再push下一条指令的地址,栈地址从高到低,所以结果应该是 0 下一条指令地址 4 arg1 8 arg2 arg1就是0x22222222 arg2是字符串数组的地址,因为数组是临时的所以地址应该比8大一些 因为指令在代码区,所以指令地址比栈地址大很多 很明显没有任何一个答案是符合的。
发表于 2021-11-26 05:03:36 回复(1)