strcpy和指针问题

小利 2011-09-03 12:14:46
请看下面两个例子

void main()
{
/*example 1
char *str = (char *)malloc(100);
strcpy(str, "hello");
free(str);
if(str !=NULL)
{
strcpy(str, "world");
printf(str);
}*/

//example 2
char *p = NULL;
strcpy(p, "hello");
printf("%s", *p);
}


在example 1中,有输出,有的是输出world,有的是输出乱码
在example 2中,编译错误。。。
为什么会这样,我个人认为都是野指针。。。
...全文
201 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
only_lonely 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dongguan131 的回复:]

1.free(str);没有赋NULL,编译器会把它随机指向一个位置,指向原位置附近的可能性较大,所以偶尔会输出world(该地址虽然free掉,可因为之前申请了该地址,所以地址仍然在)。
2.没有申请内存,肯定挂掉。
[/Quote]
至善者善之敌 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dongguan131 的回复:]
1.free(str);没有赋NULL,编译器会把它随机指向一个位置,由于操作系统的局部性原理,指向原位置附近的可能性较大,所以偶尔会输出world(该地址虽然free掉,可因为之前申请了该地址,所以地址仍然在)。
2.没有申请内存,肯定挂掉。
[/Quote]

++1
半兽人写程序 2011-09-03
  • 打赏
  • 举报
回复
第一种的情况。楼主去停车场。工作人员给你分配了一个车位。楼主1小时后候走了,并且通知管理人员。然后楼主又开了另一辆车,这次没通知管理员,而是自己闯进去,还去找之前的车位。那么会出现以下几种情况了。
1.1 原来的车位还没被管理员给别人,楼主可以停进去。不过楼主属于私自停车,下次去看也许会被警察叔叔收走,也许看到的是别人的车,也许根本没车。
1.2 原来的车位已经给别人。楼主这时会把别人的车收走,停上自己的车。不过当别人来看时,看不到自己的车会发疯的。
1.3 管理员无论如何都不知道你私自停了车(永远)。所以,他总是有可能把这个车位分配给别人。那样的话别人也会把你的车收走。停上自己的车。这时你去看你的车时,你也会发疯。
1.4 比较好的情况。停车场车很少,所以楼主可以一直偷偷停车。等到程序结束后,什么事都没发生。
qunqun2012 2011-09-03
  • 打赏
  • 举报
回复
+1

第一个,释放后,立即赋值NULL

第二个内存没有啊




[Quote=引用 3 楼 dongguan131 的回复:]

1.free(str);没有赋NULL,编译器会把它随机指向一个位置,由于操作系统的局部性原理,指向原位置附近的可能性较大,所以偶尔会输出world(该地址虽然free掉,可因为之前申请了该地址,所以地址仍然在)。
2.没有申请内存,肯定挂掉。
[/Quote]
低头路过 2011-09-03
  • 打赏
  • 举报
回复
1.free(str);没有赋NULL,编译器会把它随机指向一个位置,由于操作系统的局部性原理,指向原位置附近的可能性较大,所以偶尔会输出world(该地址虽然free掉,可因为之前申请了该地址,所以地址仍然在)。
2.没有申请内存,肯定挂掉。
jackyjkchen 2011-09-03
  • 打赏
  • 举报
回复
1.运气问题,不排除崩溃的可能

2.肯定崩溃,编译没错
hongwenjun 2011-09-03
  • 打赏
  • 举报
回复
在example 1中,free(str);的太早了,应该放到 printf 后面清空
在example 2中,没有分配空间
十八道胡同 2011-09-03
  • 打赏
  • 举报
回复
1.free之后,还要赋值给null,这样指针才保险。
2.你没有申请内存,。

void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由.

但是这个时候指针FirstByte还是指向原来那个地方的,你需要FirstByte=null;
天外来客-007 2011-09-03
  • 打赏
  • 举报
回复
解释的很好!
[Quote=引用 3 楼 dongguan131 的回复:]
1.free(str);没有赋NULL,编译器会把它随机指向一个位置,由于操作系统的局部性原理,指向原位置附近的可能性较大,所以偶尔会输出world(该地址虽然free掉,可因为之前申请了该地址,所以地址仍然在)。
2.没有申请内存,肯定挂掉。
[/Quote]
zmlcool 2011-09-03
  • 打赏
  • 举报
回复
3楼的好!!
++1
cnyourdon 2011-09-03
  • 打赏
  • 举报
回复
1楼正解
lqqz1984 2011-09-03
  • 打赏
  • 举报
回复
strcpy(str, "hello");
free(str);
if(str !=NULL)
{
strcpy(str, "world");
printf(str);
}*/
这里你先释放了,但是这个指针仍然存在指向,free只是说,str这个指针指向的内存空间被系统回收了,系统可以重新分配它了,所以这时候打印里面的内容,天知道是什么,运气好,没有被其他程序使用能够打印正常,运气不好的话。。。你也知道结果了--乱码什么的
//example 2
char *p = NULL;
strcpy(p, "hello");
printf("%s", *p);

这里的这个p指向为NULL,也就是不指向任何变量,那你能够打印什么呢? 注意你*p是取p指向的变量,你如果打印p肯定是有内容的了
Jokul_Lee 2011-09-03
  • 打赏
  • 举报
回复
++[Quote=引用 6 楼 babilife 的回复:]

引用 3 楼 dongguan131 的回复:
1.free(str);没有赋NULL,编译器会把它随机指向一个位置,由于操作系统的局部性原理,指向原位置附近的可能性较大,所以偶尔会输出world(该地址虽然free掉,可因为之前申请了该地址,所以地址仍然在)。
2.没有申请内存,肯定挂掉。


++1
[/Quote]

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧