文档章节

小结内存分配--一道经典的笔试题

刘大神
 刘大神
发布于 2016/09/14 12:04
字数 676
阅读 33
收藏 0

题目:这是一道关于内存的思考题,对以下代码的输出做出评价

1.

void GetMsg(char* msg)
{
    strcpy(msg, "my world");
    return ;
}

int main()
{
    char* pMsg = "hello world";
    GetMsg(pMsg);
    printf("%s", pMsg);
    return 0;
}
2.
char* GetMsg1()
{
    char*  pMsg = "my world";
    return pMsg;
}

int main()
{
    char pMsgs = GetMsg1();
    printf("%s", pMsgs);
    return 0;
}

3.

void  GetMsg2(char* msg)
{
    msg = (char*)malloc(10);
    return ;
}

int main()
{
    char msg[] = "hello";
    GetMsg2(msg);
    strcpy(msg, "hello world");
    printf("%s", msg);
    free(msg);
    return 0;
}

 

 

各位童鞋就大胆的猜吧(ps:不要用编译器,只能猜哦,答案在底下公布)

一、

首先,在GetMsg方法中,对msg指针变量进行拷贝赋值操作,嗯,理所当然,就这么通过了;可是,突然遇到了这样的提示:

image

内存读写冲突,那么问题来了,这是为什么呢?因为,没有分配内存!没有分配内存!没有分配内存!原因在于,形参不会自己分配内存。

二、

这个属于理想中正确输出的。

那么有童鞋会问了,内存开辟完就释放掉咯,不会留到外面,这个不应该是错的么?

原因是这样的,不管是在方法里面声明的是哪种类型的变量,方法都不会阻止你向外面传递数据,但是,你局部声明的变量会被清除掉,因为这里是大家知道的,局部变量的生命周期短,不会生存到外面;

ps:这里有个题外话,是关于引用变量的传递:

局部变量的引用 传出去了,在其他地方还是要引用这个局部变量,但是当这个方法结束之后,局部变量就被释放掉了,那传出去的引用就不知道要去引用谁了,当然就会报错了

三、

最后一题的重点在free上面,最后一个方法里面 对指针重新开辟内存,但是注意:是在局部开辟内存!!!说明这个内存只是在局部生效,那么问题来了,数组传进去的时候 退化成指针,方法结束之后,又变回了数组,为什么又会变成数组呢,因为还是局部操作不影响整体。那么最后free去释放的不是指针,是数组,是数组,是数组!free的规则是释放指针,在这里就会出现问题

 

 

 

最后:

答案:1.触发异常,内存读写冲突     2.my world            3.free 释放错误

 

 

ps:如有错误,欢迎指出,另外,还是建议大家在操作底层的时候有个良好的习惯,底层的东西错综复杂,一不小心就会酿成大错

© 著作权归作者所有

刘大神
粉丝 8
博文 21
码字总数 18133
作品 0
朝阳
高级程序员
私信 提问
2014年计算机求职总结--准备篇

版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/13000431 找工作是一个长期准备的过程,突击是没什么效果的。准备时间越长,准备就越充分,就越容...

u011729265
2013/10/27
0
0
MoreWindows博客目录(微软最有价值专家,原创技术文章152篇)

为了方便大家查找和学习,现将本人博客中所有博客文章列出目录。 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题讲解两大类 1. 《白话经典算法系列之一 冒泡排序的三种实现》 2. 《...

morewindows
2013/12/24
0
0
前端笔试、面试

让 BAT 的 Offer 不再难拿 随着各大公司春招的开始,很多小伙伴都行动起来了,我有幸能够加入百度并和大家分享自己的经验心得。由于我面试的都是比较大的公司,所以自然也是做了这方面的准备...

掘金官方
2018/01/11
0
0
一道算法题:在超市用现金结账时,如何付钱以及收银员如何找钱才能使钱的张数最少?

一道算法题:在超市用现金结账时,有以下几种纸币,arr[] =[100,50,20,5,1] ,现在求我如何付钱以及收银员如何找钱,才能使付给收银员张数和收银员找回的张数加起来最少?比如我结账需付19,...

努力的C
2017/10/20
0
0
微软等公司数据结构+算法面试100题

1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 ...

chambai
2012/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java基础-Queue

Queue实现 1、没有实现阻塞接口的 LinkedList:实现了java.util.Queue接口和java.util.AbstractQueue接口   内置的不阻塞队列:PriorityQueue和ConcurrentLinkedQueue   PriorityQueue和...

MyOldTime
21分钟前
1
0
阿里云应用高可用 AHAS 正式商用,可一键提升云上应用可用性

在分布式架构环境下,服务间的依赖日益复杂,可能没有人能说清单个故障对整个系统的影响,构建一个高可用的分布式系统面临着很大挑战。 7月17日,阿里云应用高可用服务AHAS 正式商用,包含架...

阿里云云栖社区
25分钟前
0
0
Audio 和 Video的简单介绍

HTML多媒体 , 主要分为Audio 音频和 Video 视频。 1:Audio 基本语法 src 指定当前播放的音频文件,controls播放控制器,loop歌曲循环,autoplay自动播放 (chrome66之后被禁止)主流浏览器已...

凌兮洛
38分钟前
4
0
【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)

工作中遇到需要生成PDF。最终选择了iText。其他也有通过html再生成。感觉不太适合就用了代码实现。 使用iText 5.5.13.1版本。纯Java代码实现 1.自定义表格合并指定行列完成数据填充 2.自定义...

小帅帅丶
40分钟前
10
0
Redis HyperLogLog

关于 Redis HyperLogLog 在说明 HyperLogLog 之前,我们需要先了解一个概念:基数统计。维基百科中的解释是: cardinality of a set is a measure of the “number of elements“ of the set...

xiaomin0322
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部