关于微软 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
目录
相关文章
|
存储 Kubernetes Java
SpringBoot整合MinIO
MinIO是一款基于Go语言开发的高性能、分布式的对象存储系统,开源可商用。一开始就被设计为服务于私有云、公有云、混合云,因此在高可用、可扩展性、高性能方面有得天独厚的优势。 MinIO完全实现了AWS S3 标准,在日常使用、扩展升级、迁移方面更易于管理,对于上层应用程序来说,存储和访问对象是统一的,即使MinIO服务迁移了,应用程序侧是无感知的。 MinIO分三个版本,开源版、标准版、企业版,开源版本免费使用,后面两个为付费产品。MinIO支持多种部署环境:Kubernetes、Docker、Linux、MacOS、Windows
1034 1
SpringBoot整合MinIO
|
消息中间件 存储 运维
Zabbix与ELK整合实现对安全日志数据的实时监控告警
Zabbix与ELK整合实现对安全日志数据的实时监控告警
Zabbix与ELK整合实现对安全日志数据的实时监控告警
|
8月前
|
存储 机器学习/深度学习 弹性计算
阿里云服务器2核4G、4核8G、8核16G选经济型、通用算力型和计算型哪个实例更好?
阿里云服务器提供经济型e、通用算力型u2a、计算型c9i三种实例,适配2核4G至8核16G配置。经济型e实例以共享CPU调度、低成本(如2核2G年付99元)适合轻量网站及开发测试;u2a实例基于AMD EPYC处理器,算力提升20%-40%,支持高I/O突发,适合企业级应用及中小型数据库;c9i实例搭载CIPU架构与Intel至强处理器,网络延迟<1ms,IOPS达百万级,适合机器学习推理、高并发游戏等高性能场景。用户需结合业务阶段、预算及性能需求选择最优实例。
1055 3
|
8月前
|
存储 人工智能 自然语言处理
AI英语教育APP的开发
开发AI英语教育APP,融合GenAI、NLP与教育心理学,打造智能口语陪练、自适应学习与写作批改功能。采用GPT-4o、Whisper、ElevenLabs等技术,构建高效多模态学习闭环,结合情感化人设与原创内容,实现个性化教学体验。(238字)
|
8月前
|
存储 人工智能 自然语言处理
构建AI智能体:八十八、大模型编辑:从一本百科全书到可修订的活页本
大模型编辑技术为解决传统语言模型知识固化问题提供了创新方案。该技术通过局部修改、内存增强和外部知识库三种方法实现精准知识更新:局部修改直接调整模型权重;内存增强添加外部记忆模块;外部知识库则结合检索机制。实验表明,基于Qwen1.5-0.5B模型的知识库覆盖法能有效实现即时知识更新,在保持模型完整性的同时解决传统微调成本高、耗时长的问题。该方法通过智能路由机制,成功验证了"苹果CEO"等案例的编辑效果,展现了在生产环境中实时维护模型知识的实用价值。
502 9
|
8月前
|
存储 弹性计算 网络协议
阿里云服务器ECS经济型e实例(个人或小微企业首选)采用Intel® Xeon® Platinum架构处理器
阿里云ECS经济型e实例,基于Intel® Xeon® Platinum处理器,提供多种vCPU与内存配比,适用于个人开发者、学生及小微企业用于中小型网站、开发测试等场景。支持ESSD云盘与IPv6,性价比高,助力轻量级应用高效部署。
|
8月前
|
缓存 安全 物联网
蓝牙1.0到蓝牙信标5.1发展历程:从基础连接到精准定位详解
蓝牙从1.0基础连接发展至5.1厘米级定位,历经经典蓝牙高速传输、BLE低功耗革新,再到AoA/AoD高精度定位突破,推动信标技术在零售、工业、智慧城市等场景广泛应用,持续引领短距离无线连接与定位演进。如果您想进一步了解蓝牙定位技术和案例,欢迎搜索维构lbs智能定位~
|
9月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器收费标准:今年最新价格表,ECS、轻量和GPU云服务器报价清单
阿里云今年最新云服务器租用优惠价格表,这个月的价格和上个月持平,阿小云整理最新优惠价格:依旧是轻量应用服务器200M峰值带宽68元1年(秒杀38元),ECS云服务器2核2G3M带宽99元一年、2核4G、5M带宽、80G系统盘优惠价格199元一年,4核16G服务器10M带宽89元1个月,8核32G服务器10M固定带宽160元一个月,阿里云香港轻量服务器200M带宽25元个月起。
|
10月前
|
人工智能 决策智能
清华大学“Al+经管 零基础玩转大模型”AI Day举办成功丨云工开物
2025年11月13日,清华经管学院CDC联合阿里云举办“AI+经管”AI day,百余名学生参与。活动通过“讲座+实践”形式,聚焦大模型在经管领域的应用,涵盖金融智能体、多智能体协同、零代码数据看板等实战内容,助力学生掌握AI技能,推动AI与专业融合,提升数智时代竞争力。
|
JSON Unix Linux
Elasticsearch如何安装
Elasticsearch如何安装

热门文章

最新文章