一道内存分配的面试题后续

昨天写的题目,在VC6.0上面测试一下

一道内存分配的面试题

结果发现一个问题,发现输出结果竟然没有问题,我很慌,如果这样的输出结果没有问题的话,那肯定是跟我们的理论对不上号的。

所以我只能继续调试

先把问题抛在printf上,怀疑printf输出是有问题的,基于这个猜测,我自己写了一个printf函数。

#include "stdafx.h"
#include "stdio.h"char * pg =NULL;void test_printf(char * pch)
{while(*pch != 0)putchar(*pch++);putchar('\n');
}char * test_function(int n)
{int a = 3;char *p1 = "123";char p2[] = "456";pg = (char *)p2;printf("%p %p %p\n",&a,p1,p2);if(n == 0)return p1;return pg;
}int main(int argc, char* argv[])
{test_printf(test_function(1));test_printf(test_function(0));printf("%s\n",(char *)0x0019fecc);printf("%s\n",(char *)0x0019fecc);return 0;
}

0x0019fecc 这个地址每个人程序会不一样,不要照抄。

程序输出

如果使用默认的printf输出,这样的代码

#include "stdio.h"char * pg =NULL;char * test_function(int n)
{int a = 3;char *p1 = "123";char p2[] = "456";pg = (char *)p2;printf("%p %p %p\n",&a,p1,p2);if(n == 0)return p1;return pg;
}int main(int argc, char* argv[])
{printf("%s\n",test_function(1));printf("%s\n",test_function(0));return 0;
}

输出没有问题

这时候我们只能进行单步调试了

注意单步调试的最后一步,在test_function退出的时候,p2地址0x0019fecc地址的内容已经改变,但是经过printf调用后,这个地址的内容就被取走了。然后再调用一次就出问题了。

在第一次函数执行结束后,0x0019fecc地址的值还是 456。

但是在执行printf之后,0x0019fecc中的内容就被改变了,如下图


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

嵌入式Linux

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题(31)—— 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值&#…

Qt学习之路(11): MainWindow

尽管Qt提供了很方便的快速开发工具QtDesigner用来拖放界面元素,但是现在我并不打算去介绍这个工具,原因之一在于我们的学习大体上是依靠手工编写代码,过早的接触设计工具并不能让我们对Qt的概念突飞猛进……前面说过,本教程很大程…

要毕业了,我应该做点啥?

这几天是高考的日子,高考结束,也意味着有很多人要离开学校,距离我毕业已经过去很多年了,现在还能记得那些无忧无虑的日子,毕竟人这一辈子,能这么肆无忌惮的时间并不多。最近因为发了几个不错的岗位招聘&…

每日一题(32)—— 联合体大小

设有以下说明和定义: typedef union {long i;int k[5];char c; } DATE; struct data {int cat;DATE cow;double dog; } too; DATE max;则语句 printf("%d",sizeof(struct date)sizeof(max));的执行结果是: 分析: 16位编译器中&…

开始→运行→输入的命令集锦

mstsc--远程桌面连接 logoff--注销命令 rononce -p --15秒关机 tsshutdn--60秒倒计时关机命令 iexpress--木马捆绑工具,系统自带 tourstart--xp简介(安装完成后出现的漫游xp程序) winchat--XP自带局域网聊天 sndrec32--录音机 Nsl…

我那个37岁的大神朋友,后续

还记得我之前写的这篇文章吗?我一个37岁的程序员朋友写这篇文章的时候,我建议我的这个朋友跳槽找更好的工作,可以换个行业,换一个更有钱的领域,做技术不能单单是做技术,需要有点眼光,比如选择行…

[洛谷P1231] 教辅的组成

题目大意:有n1本书,n2本练习册和n3个答案,然后又一些条件,说明某本答案可能和某本书对应,某本练习册可能和某本书对应,求最多有多少本完整的书(有书,练习册,答案&#xf…

每日一题(33)——用两个栈实现一个队列的功能?要求给出算法和思路

用两个栈实现一个队列的功能?要求给出算法和思路。 设2个栈为A,B, 一开始均为空. 入队: 将新元素push入栈A; 出队: (1)判断栈B是否为空; (2)如果不为空,则将栈B中最顶元素pop出;如果为空,则将A中所有元素POP出并…

可以用在任何人身上:百战百胜人生10大成功秘诀

这里介绍的10个成功秘诀,可以接受时代变迁的考验,可以用在任何人身上,更可以与时推移,永不落伍。尽管它们不是立杆见影的妙药,但只要你身体力行,定能改善你的生活方式。  1.必须先在内心深处感受到爱&…

扒一扒中断为什么不能调printf

[导读] 大家好,我是逸珺。前面说会写一下Modbus-RTU的实现,写了1000多字了,有兴趣的稍等一下哈。前面在一个群里看到一个朋友在一个串口接收中断里打印遇到了问题,今天聊下这个话题。扒一扒printf 对于单片机中printf到底向哪里打…

P4555 最长双回文串

题目描述 顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同)。 输入长度为 n的串 S ,求 S的最长双回文子串 T ,即可将 T 分为两部分 X, …

每日一题(34)—— 线程

1.线程的概念: 2 与进程的区别: 3 线程与进程的区别和联系? 线程是否具有相同的堆栈? 1、线程是指进程内的一个执行单元,也是进程内的可调度实体. 2、与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源…

如何利用MySQL加密函数保护Web网站敏感数据

如果您正在运行使用MySQL的Web应用程序,那么它把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受***或者窥探者的获取是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者破坏应用程序,同时还要保证您的竞争…

躺平,躺下就能赢吗?

之前在群里讨论这个话题,说躺平挺好的,没那么大压力,我也觉得躺平是好事,每个人都要追求理想的权力,那么反过来,每个人也有不追求理想的权力。躺平如果说的好听一些,也可以认为是躺赢&#xff0…

第一站---大连---看海之旅

5月下旬至7月上旬 是大连最舒服的季节 还不是很热 微风拂面 神清气爽的感觉 工具/原料 坐公交的零钱防晒霜可以下水的鞋推荐一下旅游路线吧个人意见:来大连必去的几个景点分为两类:免费的: 1.星海湾景区。在星海湾景区你可以来到星海广场、星海湾浴场、星海公园,这…

感觉stm32太简单是一种自负吗?

其实简单或者复杂都不重要,重要的是通过STM32我们能学习到什么?做一个键盘/鼠标,可以学习USB协议。做一个联网设备,需要学习以太网,TCP/IP协议的底层实现。做一个无线设备,可能需要学习蓝牙、WIFI或者zigbe…

回车 触发 提交事件

//gridview 文本框 回车 触发 Button 事件 < script type "text/javascript" language "javascript" > function clickButton() { if ( event.keyCode 13 ) { document.all ( ibtnUpdate ).click(); return false; } } < / script > < a…

每日一题(35)—— heap与stack的差别

heap与stack的差别: Heap是堆&#xff0c;stack是栈。 Stack的空间由操作系统自动分配/释放&#xff0c;Heap上的空间手动分配/释放。 Stack空间有限&#xff0c;Heap是很大的自由存储区 C中的malloc函数分配的内存空间即在堆上,C中对应的是new操作符。 程序在编译期对变量…

Scrapy学习-25-Scrapyd部署spider

Scrapyd部署爬虫项目 github项目https://github.com/scrapy/scrapyd 官方文档http://scrapyd.readthedocs.org/ 安装scrapydhttp://scrapyd.readthedocs.io/en/stable/install.html 运行# 在虚拟环境中使用scrapd命令# scrapyd是一个服务器监听在本地的6800端口scrapyd 安装scr…

耗时两年,19岁小伙采用230片纯74逻辑芯片搭建出32位处理器!可玩贪吃蛇

从设计 CPU、制作原型机、最终成品到软件编程&#xff0c;19 岁极客小伙用了整整两年的时间。RISC-V 是一个基于精简指令集&#xff08;RISC&#xff09;原则的开源指令集架构&#xff08;ISA&#xff09;&#xff0c;它是对应开源软件运动的一种「开源硬件」。该项目于 2010 年…