Chinaunix首页 | 论坛 | 博客
  • 博客访问: 239706
  • 博文数量: 62
  • 博客积分: 973
  • 博客等级: 准尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-16 23:25
文章分类

全部博文(62)

文章存档

2013年(1)

2012年(14)

2011年(47)

分类: 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)语句不起作用。

//blog.csdn.net/lzueclipse/article/details/5834605
阅读(1867) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~