关于微软 2012 暑期实习题第 5 题

简介:     本文中提到的题目来自于这篇文章:《2012微软暑期实习笔试题及答案》 中的第五题。这道题目是这样的:   5. What is output if you compile and execute the following code?void main() {     int ...

    本文中提到的题目来自于这篇文章:《2012微软暑期实习笔试题及答案》 中的第五题。这道题目是这样的:

 

5. What is output if you compile and execute the following code?

void main()
{
    int i = 11;
    int const *p = &i;
    p++;
    printf( "%d", *p);
}

(A) 11;  (B) 12;  (C) Garbage value;  (D) Compile error;  (E) None of above.

 

    首先,很显然这道题目第一要考察 const 的写法,也就是这个代码中 const 修饰的是指针变量 p 还是被 p 指向的整数。简单的记忆的方法就是 const 修饰的是最靠近它的东西,左侧优先。因此这句话中 const 修饰的是左侧的 int,即相当于 const int* p; 所以通常采用后者这种写法,因为后者更符合阅读(pointer to const int),不容易引发认知错误。因此,上面的代码能通过编译,即答案 (D)首先可以被排除。

 

    p++ 使 p 向高地址移动了一个 int 的距离(对于win32,4 bytes),移动后指向了什么位置呢?显然依然是一个栈上地址。但这道题目是不是就应该选(C)Gargage Value 呢?所以这道题目比较有趣,它涉及到了函数调用时 stack frame 的细节。因此我们还需要更明确的分析 stack 上的存储内容,明确 p 指向了什么,然后才能给出结论。

 

    我们先给出一个基本结论,p 被初始化指向 i (因为 i 是第一个出现的临时变量,所以 i 是最靠近返回值地址的(savedPC)),这时继续让 p 的指向向 savedPC 的方向移动一个 int 元素跨度。【注意减小 sp 相当于在栈上开辟空间,增加 sp 相当于释放栈上空间,p++ 使得向栈内方向而不是栈外方向移动,正是这种移动方向导致这道题的答案带有了争议性。我们非常希望 int 不是第一个临时变量,假设它前面还有其他变量,那么我们就可以更明确的指出 p 会指向在 i 之前出现的临时变量。可惜 i 就是第一个临时变量。假如编译器分配空间时,让 i 和 savedPC 紧邻,则这会导致 p 指向 savedPC。但幸运的是,在后面的分析中可以看到编译器竟然会在 i 和 savedPC 可能会预留出垃圾数据。】

 

    首先把上面的代码用 VC6.0 做一个实验,编译配置是 Win32 Debug,把最后一句替换成 printf("%08X\n", *p); 发现输出结果是:0012FFC0。

    然后使用 IDA 反汇编分析可执行文件。

    首先,main 函数的返回值类型和参数列表(本题目中为 void main ( void ); )不重要,不会影响生成的代码。生成的 main 函数实际上是三个参数,汇编代码对应的原型是:

 

    int main(int argc, char* argv[], char* environ[]);

 

    其中 environ 是一个废弃参数,类似 argv 它也是一个字符串数组,以 NULL 元素为截止标志,是一些"key = value"形式的系统环境变量之类的字符串。

 

    使用 VC6 debug (注意:不同编译器,不同编译选项结果不同,参考补充部分),main 函数的汇编代码如下:

 

 main            proc near               ; CODE XREF: j_main
目录
相关文章
|
6月前
|
负载均衡 Java Apache
实习工作总结(一)
实习工作总结(一)
47 0
|
7月前
|
开发者
备考两年,关于软考的经验都在这了
本文分享了作者备考软考两年的一些学习经验,并配有知识点的思维导图,期望能对各位备考同学有所帮助。
|
数据采集 人工智能 算法
2022年计算机保研夏令营经验总结,11所院校经历,预推免上岸北大
2022年计算机保研夏令营经验总结,11所院校经历,预推免上岸北大
|
存储 人工智能 分布式计算
想当程序员吗?这11所大学计算机专业堪称国内顶级,高考考生千万不要错过
为大家盘点一下目前国内计算机专业比较好的大学。
316 1
|
缓存 移动开发 前端开发
跳槽后在新公司的一点感悟
  最近跳槽到一家创业多年的小公司,带一个前端小团队。   在这一个多月中,主要是熟悉业务,维护老代码,编写新业务等,期间也发现了当前团队出现的种种问题,打算在接下来的日子里好好改造。
跳槽后在新公司的一点感悟
|
Arthas NoSQL 算法
二本院校学弟大二开始实习,大三收割阿里、腾讯实习offer
二本院校学弟大二开始实习,大三收割阿里、腾讯实习offer
二本院校学弟大二开始实习,大三收割阿里、腾讯实习offer
|
消息中间件 算法 前端开发
双非本科22届暑期实习,成功拿到B站、阿里实习offer
拼一把不一定成功,但是不试试看肯定没有结果!
双非本科22届暑期实习,成功拿到B站、阿里实习offer
|
机器学习/深度学习 算法 前端开发
秋招上岸!双非本科,从外包实习到秋招收获阿里、美团、B站意向书!
大家好,我是路飞,今天这篇文章是来还愿的!秋招顺利结束,感谢大家一直以来的支持和陪伴!
秋招上岸!双非本科,从外包实习到秋招收获阿里、美团、B站意向书!
|
分布式计算 网络协议 算法
中科大软件学院硕士:实习秋招百多轮面试总结(中)
中科大软件学院硕士:实习秋招百多轮面试总结(中)
320 0
|
数据挖掘 开发者
阿里云实习生究竟有什么不同?
张云皓:用心将自己的角色做到极致——阿里云实习生的故事
阿里云实习生究竟有什么不同?