C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用链接

留言簿(8)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

1、如果函数的参数是一个指针,不要用该指针去申请动态内存

#include <iostream>
using namespace std;
void GetMemory(char *p,int num)
{
    p
=(char *)malloc(sizeof(char* num);
}

void Test(void)
{
    
char *str=NULL;
    GetMemory(str,
100);    //str仍然为NULL
    strcpy(str,"hello");//运行错误
}

int main()
{
    Test();
    
return 0;
}

      上面的代码在编译无错误的,可是在执行时,出现了错误。调试发现,str仍然为NULL。str并没有指向GetMemory()所申请的内存,在函数被调用时,编译器会被调用函数的参数产生一个副本_p,使_p=p,如果函数体内修改_p的内容,那么导致参数p的内容作相应的修改,这就是指针可以作为输出参数的原因。在本例中,_p重新申请了一块内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以GetMemory并不能返回任何东西。所以str仍然为NULL,导致程序运行错误。事实上,每执行一次GetMemory(),就会造成内存的泄露,因为申请的内存并没有被释放。
       如果要用指针参数申请内存,使用指向指针的指针可以完成此功能

#include <iostream>
using namespace std;
void GetMemory(char **p,int num)
{
    
*p=(char *)malloc(sizeof(char* num);
}

void Test(void)
{
    
char *str=NULL;
    GetMemory(
&str,100);    //注意参数是&str,而不是str
    strcpy(str,"hello");
    cout<<str<<endl;
    free(str);
}

int main()
{
    Test();
    
return 0;
}

2、函数返回值传递动态内存

      利用函数的返回值传递动态内存,见实例代码:
#include <iostream>
using namespace std;
char *GetMemory(int num)
{
    
char *p=(char *)malloc(sizeof(char* num);
    
return p;
}

void Test(void)
{
    
char *str=NULL;
    str
=GetMemory(100);
    strcpy(str,"hello");
    cout<<str<<endl;
    free(str);
}

int main()
{
    Test();
    
return 0;
}

      函数的返回值传递动态内存,内存不能为栈内存,因为该内存再函数结束时自动消亡。
#include <iostream>
using namespace std;
char *GetMemory(void)
{
    
char *p="hello world";
    
//书上说,这句话编译器应该提出警告,但是vc6没有
    return p;    
}

void Test(void)
{
    
char *str=NULL;
    str
=GetMemory();    //书上说str的内容是垃圾
    cout<<str<<endl;
}

int main()
{
    Test();
    
return 0;
}

想要获得更多内容,可点击:《Visuanl C++代码参考与技巧大全》学习笔记——索引随笔
posted on 2010-02-15 16:09 烟皑 阅读(898) 评论(0)  编辑 收藏 引用 所属分类: 《Visual C++代码参考与技巧大全》学习笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理