博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小结内存分配--一道经典的笔试题
阅读量:6877 次
发布时间:2019-06-26

本文共 1277 字,大约阅读时间需要 4 分钟。

hot3.png

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

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指针变量进行拷贝赋值操作,嗯,理所当然,就这么通过了;可是,突然遇到了这样的提示:

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

二、

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

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

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

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

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

三、

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

 

 

 

最后:

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

 

 

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

转载于:https://my.oschina.net/OkamiLiu/blog/746678

你可能感兴趣的文章
Swift 控制流
查看>>
css浮动、BFC、定位问题
查看>>
ThoughtWorks雷达上的新奇变化
查看>>
Kubernetes首爆严重安全漏洞,请升级你的Kubernetes
查看>>
Linux之父为过去的言行道歉,宣布离开社区反思
查看>>
家政APP开发,需要注意什么问题?
查看>>
【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
查看>>
C语言接口与实现实例
查看>>
含有汉字的固定字符由ZHS16GBK数据库导入到AL32UTF8的数据库
查看>>
php-fpm进程数优化
查看>>
iOS中如何对具有复杂依赖的SDK在真机上进行单元测试
查看>>
Mobile Web中URL设计问题
查看>>
core Animation之CAAnimationGroup(动画群组)
查看>>
重构实践:体验interface的威力(一)
查看>>
UILabel混合显示动画效果
查看>>
Java内存泄露
查看>>
窥探Swift编程之强大的Switch
查看>>
R语言学习路线图-转帖
查看>>
【导入导出】sqlldr 导入含有内嵌换行符的数据
查看>>
Linux中常用命令
查看>>