分类: C/C++
2011-12-06 23:38:27
试题4:
void GetMemory(char *p)
{
p = (char*)malloc(100);
}
void Test( void )
{
char *str = NULL;
GetMemory(str);
strcpy( str, "hello world" );
printf( str );
free(str);
str=NULL;
}
答:对于C语言中的值传递,str传给GetMemory中的形参p后,p的改变不会传递给str(注意:此处说的是p的改变而不是,p指向的
数据的改变),所以str仍然为NULL,会segment fault。
试题5:
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf(str);
free(str);
str=NULL;
}
答:p是局部变量,位于栈空间,当离开GetMemory,p被销毁。printf(str)打印结果不确定,free那句错误,不是堆空间。
试题6:
void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
free(str);
str=NULL;
}
答:malloc后,应判断 *p是否NULL
试题7:
void Test( void )
{
char *str = (char *)malloc(100);
strcpy( str, "hello" );
free( str );
str = NULL;
}
这个题目自身有问题,深层次思考:
出题人原意,free(str)后,用str = NULL杜绝野指针,但是这种写法过于教科书化,离开这个函数,str都不能使用了,还搞个str=NULL,不需要。
看看这个:
swap( int* p1,int* p2 )
{
int *p;// p未非配空间,这个才是野指针,因为马上使用了
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
还有一个:
void test(void)
{
char str = (char ) malloc(100)
strcpy(str, "hello");
free(str);
if(str != null)
{
strcpy(str “world”);//野指针
printf(str)
}
}
请问运行test函数会有什么样的结果?
篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str) 之后,str成为野指针,
if(str != null)语句不起作用。