社区
C语言
帖子详情
C语言笔试题
vv1133
2009-12-27 07:27:18
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);printf(str);
}
}
请问运行Test 函数会有什么样的结果?
答:输出“world”
请问这题str已经free掉了,为什么还能用strcpy赋值?
...全文
176
14
打赏
收藏
C语言笔试题
void Test(void) { char *str = (char *) malloc(100); strcpy(str, “hello”); free(str); if(str != NULL) { strcpy(str, “world”);printf(str); } } 请问运行Test 函数会有什么样的结果? 答:输出“world” 请问这题str已经free掉了,为什么还能用strcpy赋值?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wangzhiwenwzw
2009-12-29
打赏
举报
回复
这属于野指针问题:野指针是指那些你已经释放掉的内存指针。
当你调用free(p)时,你真正清楚这个动作背后的内容吗?你会说p指向的内存被释放了。没错,p本身有变化吗?答案是p本身没有变化。它指向的内存仍然是有效的,你继续读写p指向的内存,没有人能拦得住你。
释放掉的内存会被内存管理器重新分配,此时,野指针指向的内存已经被赋予新的意义。对野指针指向内存的访问,无论是有意还是无意的,都为此会付出巨大代价,因为它造成的后果,如同越界访问一样是不可预料的。
(内存越界访问:
内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出。所写入的数据对别人来说是随机的,它也会产生不可预料的后果。)
释放内存后立即把对应指针置为空值,这是避免野指针常用的方法。这个方法简单有效,只是要注意,当然指针是从函数外层传入的时,在函数内把指针置为空值,对外层的指针没有影响。比如,你在析构函数里把this指针置为空值,没有任何效果,这时应该在函数外层把指针置为空值。
NaS7Li
2009-12-27
打赏
举报
回复
他们说的都对!
hbvanguard
2009-12-27
打赏
举报
回复
根本就是错误的程序还能得出运行结果,更要命的是还要问个为什么
东大坡居士
2009-12-27
打赏
举报
回复
这么用很危险,不过出错还是机率性的~
liate1
2009-12-27
打赏
举报
回复
路过学习了。
shiweifu
2009-12-27
打赏
举报
回复
我直接告诉面试官,这么写是错的,他会怎么说?
febbird1984
2009-12-27
打赏
举报
回复
free的時候把str和那块内存的"绑定"关系解除了,那块内存"自由"了,但是str的值并没有改变,还是可以通过str来访问那块内存,虽然这么做比较危险,因为那块内存有可能存入了其他东西
vv1133
2009-12-27
打赏
举报
回复
[Quote=引用 6 楼 zhaixingchen 的回复:]
free掉只是释放了这块内存,并没有让它指向NULL,所以if判断为真,执行strcpy()
[/Quote]
我知道他没指向NULL,我的意思是执行strcpy它为什么不会出现段错误?
zhaixingchen
2009-12-27
打赏
举报
回复
free掉只是释放了这块内存,并没有让它指向NULL,所以if判断为真,执行strcpy()
vv1133
2009-12-27
打赏
举报
回复
但是free之后,再操作这块内存,不会越界吗?
z569362161
2009-12-27
打赏
举报
回复
[Quote=引用 3 楼 thefirstz 的回复:]
free只是告诉操作系统这块内存可以用作它用,但你照样可以朝里面写东西(虽然这样很危险)~~
[/Quote]
学C专家又来回答了
昵称很不好取
2009-12-27
打赏
举报
回复
free只是告诉操作系统这块内存可以用作它用,但你照样可以朝里面写东西(虽然这样很危险)~~
stardust20
2009-12-27
打赏
举报
回复
http://topic.csdn.net/u/20090810/16/2592c0d8-9c14-4456-8530-b569e4430e26.html
honghu069
2009-12-27
打赏
举报
回复
free 只是告诉系统这块内存不用了
系统回收这块内存
C语言
笔试题
及答案
C语言
笔试题
及答案
C语言
笔试题
及答案
C语言
笔试题
及答案
C语言
笔试题
及答案
C语言
笔试题
及答案
C语言
笔试题
及答案
C语言
笔试题
及答案
C语言
笔试题
及答案
各企业
C语言
笔试题
整理
企业软件工程师
笔试题
目集合
C语言
笔试题
整理
二级
C语言
——程序修改题篇
本课程需要有
C语言
基础,不适合零基础者!
新华三
C语言
笔试题
(18年两套).rar
新华三
C语言
笔试题
,两套试题,3HC
笔试题
, 可看。
六套华为
C语言
笔试题
六套华为
C语言
笔试题
六套华为
C语言
笔试题
C语言
69,368
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章