#include <iostream>
#include <cstring>
#include <string>
using namespace std ;
int main ( )
{
char *str = ( char * ) malloc( 100 ) ;
strcpy( str , "hello baby" ) ;
free( str ) ;
if( str != NULL )
{
strcpy( str , "world " ) ;
cout << string( str ) << endl ;
}
return 0 ;
}
请教这个程序,已经释放了str指向的内存空间,为什么还可以使用strcpy这个函数实现复制呢?
19 个解决方案
#1
释放了就让str=NULL;吧。
#2
楼主拿下面的代码去玩玩,看有没有灵异事件?
#include <iostream>
#include <cstring>
#include <string>
using namespace std ;
int main ( )
{
char *str = ( char * ) malloc( 100 ) ;
strcpy( str , "hello baby" ) ;
free( str ) ;
int * ai= ( int * ) malloc( 100 ) ;
ai[0]=100;
cout<<ai[0]<<endl;
if( str != NULL )
{
strcpy( str , "world " ) ;
cout << string( str ) << endl ;
cout<<ai[0]<<endl;
}
free(ai);
return 0 ;
}
#3
free不给str赋NULL,所以下面的str!=NULL判断是没用的,free的空间并不是不能用,只是已经不属于你的程序,随时可能会分给其它程序
#4
复制会执行,但是是错的。
#5
free(str);//只是把str指向的空间释放了,但是str指针还在,第二次你使用strcpy的时候没有打印出来东西
#6
free并不返回NULL指针
#7
这个就是林锐说的 野指针的问题,
释放了一定赋值NULL
释放了一定赋值NULL
#8
这个要靠你自己控制。。。free之后记得先置空就可以了。
#9
#include <iostream>
#include <cstring>
#include <string>
using namespace std ;
struct Test
{
virtual void fun(){ cout<<"I am test!";}
};
int main ( )
{
char *str = ( char * ) malloc( 100 ) ;
strcpy( str , "hello baby" ) ;
free( str ) ;
Test t = new Test;
if( str != NULL )
{
strcpy( str , "world " ) ;
cout << string( str ) << endl ;
}
t.fun();
return 0 ;
}
运行这个代码看是否会出错。
#10
看一下
#11
正解!
#12
野指针!
#13
出错的,这个代码
#14
确实很灵异,能解释下嘛?
#15
编译出错,conversion from "test *"to non-scalar type "test" requested
#16
碰巧没有出错而已,因为空间刚被你申请过,所以没有被占用,实际上已经造成内存使用错误。
#17
str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...
#18
str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...
[/Quote]那cout<<ai[]输出的应该是str的值啊,怎么是个地址啊
#19
那cout < <ai[]输出的应该是str的值啊,怎么是个地址啊
[/Quote]
那个不是地址,那是被改变后的内容转换成 int型之后的值。“world”在内存中表示为 0x776f726c6400,前四个字节0x77 6f 72 6c,表示的int型数 为0x 6c 72 6f 77(小端表示转换过来),就是输出的值。
[/Quote]
那个不是地址,那是被改变后的内容转换成 int型之后的值。“world”在内存中表示为 0x776f726c6400,前四个字节0x77 6f 72 6c,表示的int型数 为0x 6c 72 6f 77(小端表示转换过来),就是输出的值。
#20
#1
释放了就让str=NULL;吧。
#2
楼主拿下面的代码去玩玩,看有没有灵异事件?
#include <iostream>
#include <cstring>
#include <string>
using namespace std ;
int main ( )
{
char *str = ( char * ) malloc( 100 ) ;
strcpy( str , "hello baby" ) ;
free( str ) ;
int * ai= ( int * ) malloc( 100 ) ;
ai[0]=100;
cout<<ai[0]<<endl;
if( str != NULL )
{
strcpy( str , "world " ) ;
cout << string( str ) << endl ;
cout<<ai[0]<<endl;
}
free(ai);
return 0 ;
}
#3
free不给str赋NULL,所以下面的str!=NULL判断是没用的,free的空间并不是不能用,只是已经不属于你的程序,随时可能会分给其它程序
#4
复制会执行,但是是错的。
#5
free(str);//只是把str指向的空间释放了,但是str指针还在,第二次你使用strcpy的时候没有打印出来东西
#6
free并不返回NULL指针
#7
这个就是林锐说的 野指针的问题,
释放了一定赋值NULL
释放了一定赋值NULL
#8
这个要靠你自己控制。。。free之后记得先置空就可以了。
#9
#include <iostream>
#include <cstring>
#include <string>
using namespace std ;
struct Test
{
virtual void fun(){ cout<<"I am test!";}
};
int main ( )
{
char *str = ( char * ) malloc( 100 ) ;
strcpy( str , "hello baby" ) ;
free( str ) ;
Test t = new Test;
if( str != NULL )
{
strcpy( str , "world " ) ;
cout << string( str ) << endl ;
}
t.fun();
return 0 ;
}
运行这个代码看是否会出错。
#10
看一下
#11
正解!
#12
野指针!
#13
出错的,这个代码
#14
确实很灵异,能解释下嘛?
#15
编译出错,conversion from "test *"to non-scalar type "test" requested
#16
碰巧没有出错而已,因为空间刚被你申请过,所以没有被占用,实际上已经造成内存使用错误。
#17
str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...
#18
str指向的空间已经被释放,ai申请内存时,系统把原先分配给str的空间分配给了ai,再做拷贝的时候修改了已经不属于str,而是属于ai的内存,so...
[/Quote]那cout<<ai[]输出的应该是str的值啊,怎么是个地址啊
#19
那cout < <ai[]输出的应该是str的值啊,怎么是个地址啊
[/Quote]
那个不是地址,那是被改变后的内容转换成 int型之后的值。“world”在内存中表示为 0x776f726c6400,前四个字节0x77 6f 72 6c,表示的int型数 为0x 6c 72 6f 77(小端表示转换过来),就是输出的值。
[/Quote]
那个不是地址,那是被改变后的内容转换成 int型之后的值。“world”在内存中表示为 0x776f726c6400,前四个字节0x77 6f 72 6c,表示的int型数 为0x 6c 72 6f 77(小端表示转换过来),就是输出的值。