看起来有问题,但是运行起来却没有问题,
/我的代码/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *p = NULL;
p = ( char * )malloc( 4 * sizeof( char ) );
free( p ); /****这里已经释放了p指向的内存块****/
strcpy( p, "abc" );
printf( "%s\n", p );
retrun 0;
}
/*free( p )释放了p指向的内存块,但是并没有改变p本身。于是产生了悬空指针,此时
p不再指向有效的内存块,strcpy函数修改了p指向的内存块,却没有造成程序崩溃,为啥? *不科学啊?/
本人再Mac OS X 10.9上编译,运行却没有出错。求解释》》》!!!
char *p = NULL; // 声明p 并赋值NULL
p = ( char * )malloc( 4 * sizeof( char ) ); // p的值现在是一个内存地址
free( p ); // p的值所表示的那块内存被释放
// 释放的意思是标记为空闲,可利用的,下次再malloc的时候可以用这块内存
// 但是p现在的值,根!本!没!变!还是原来那个内存地址
strcpy( p, "abc" ); // 把"abc" 拷贝到p指向的区域,p还指着那块内存
// 只要这块内存没被再次分配,万事大吉~
// 如果别的程序正在用这块内存,或者你的程序其他地方用到了这块内存
// (你不是释放了嘛,操作系统当然可以重新分配)
// 恭喜你,要出问题了,出啥问题?我也不知道。。。取决于程序是怎么用这块内存的
// 要我举例? 好吧,比如浏览器用包含这4个字节的一块内存区域存放一张图片
// 那么图片中这几个字节就被你改写了,图片可能就花了。或者显示不出来了。。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。