Chinaunix首页 | 论坛 | 博客
  • 博客访问: 654112
  • 博文数量: 150
  • 博客积分: 4070
  • 博客等级: 中校
  • 技术积分: 1795
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-23 21:44
文章分类

全部博文(150)

文章存档

2012年(1)

2011年(123)

2010年(26)

分类: C/C++

2010-12-26 15:24:27

1void GetMemory(char **p, int num)

{  

*p = (char *)malloc(num); 

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");

printf(str);

}

请问运行Test 函数会有什么样的结果?

答:输出“hello” 注意GetMemory函数中的p参数是指向指针的指针,如果是一级指针则出现错误,不会得到申请的地址空间。

 

2void GetMemory(char *p, int num)

{  

*p = (char *)malloc(num); 

}

void Test(void)

{

char *str = NULL;

GetMemory(str, 100);

strcpy(str, "hello");

printf(str);

}

请问运行Test 函数会有什么样的结果?

答:运行出错,注意与1中参数p的类型比较,1中是char **p,而本题是char *p。而且像这种情况还会导致每次都泄露一块内存的危险。

 

3char *GetMemory(void)

{

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}

请问运行Test 函数会有什么样的结果?
答:无效的指针,输出不确定,因为p是函数GetMemory中申请的是一个临时变量,函数调用完后,其空间已经不再存在。

4char *GetMemory3(int num)

{

char *p = (char *)malloc(sizeof(char) * num);

return p;

}

void Test3(void)

{

char *str = NULL;

str = GetMemory3(100);

strcpy(str, "hello");

cout<< str << endl;

free(str);

}

请问运行Test 函数会有什么样的结果?
答:输出”hello”,因为是返回动态申请的内存,只要不释放内存,即调用free函数,就可以使用该段内存。

 

5char *GetString2(void)

{

char *p = "hello world";

return p;

}

void Test5(void)

{

char *str = NULL;

str = GetString2();

cout<< str << endl;

}

答:函数Test5运行虽然不会出错,但是函数GetString2的设计概念却是错误的。因为GetString2内的hello world是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetString2,它返回的始终是同一个只读的内存块。如果此时还想利用strcpystr中写数据时,将出现错误。如strcpy(str,hello world)

 

 

阅读(659) | 评论(1) | 转发(0) |
0

上一篇:指针与引用的区别

下一篇:内存与指针

给主人留下些什么吧!~~

chinaunix网友2010-12-30 12:39:56

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com