发布日期:2016-02-29 13:43 来源: 标签: 编程语言 C++开发语言 C++指针与数组 C++内存分配管理
本章我们主要学习在C++中指针参数是如何传递内存的,下面们就做一下具体讲解,希望大家多多支持中国站长网络学院。

如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例4-1中,test函数的语句getmemory(str, 200)并没有使str获得期望的内存,str依旧是null,为什么?
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"); // 运行错误  
    }   
示例4.1 试图用指针参数申请动态内存 
毛病出在函数getmemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数getmemory并不能输出任何东西。事实上,每执行一次getmemory就会泄露一块内存,因为没有用free释放内存。
如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例4.2。
    void getmemory2(char **p, int num)  
    {  
     *p = (char *)malloc(sizeof(char) * num);  
    }  
    void test2(void)  
    {  
     char *str = null;  
     getmemory2(&str, 100); // 注意参数是 &str,而不是str  
     strcpy(str, "hello");   
     cout<< str << endl;  
     free(str);   
    }   
示例4.2用指向指针的指针申请动态内存 
由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,见示例4.3。
    char *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);   
    }   
//示例4.3 用函数返回值来传递动态内存  
用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例4.4。
    char *getstring(void)  
    {  
     char p[] = "hello world";  
     return p; // 编译器将提出警告  
    }  
    void test4(void)  
    {  
     char *str = null;  
     str = getstring(); // str 的内容是垃圾  
     cout<< str << endl;  
    }   
//示例4.4return语句返回指向“栈内存”的指针 
用调试器逐步跟踪test4,发现执行str = getstring语句后str不再是null指针,但是str的内容不是“hello world”而是垃圾。
如果把示例4.4改写成示例4.5,会怎么样?
    char *getstring2(void)  
    {  
     char *p = "hello world";  
     return p;  
    }  
    void test5(void)  
    {  
     char *str = null;  
     str = getstring2();  
     cout<< str << endl;  
    }   
示例4.5 return语句返回常量字符串 
函数test5运行虽然不会出错,但是函数getstring2的设计概念却是错误的。因为getstring2内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用getstring2,它返回的始终是同一个“只读”的内存块。

相关评论

专题信息
    Visual C++是一个功能强大的可视化软件开发工具,是高等院校计算机及相关专业主要核心课程。 本教程对Visual C++ 的应用与开发进行了详细系统的介绍,内容主要包括:Visual C++程序的建立,菜单、工具栏和状态栏的创建,对话框和常用控件,窗口、文档与视图,图形绘制,数据库应用,多媒体技术等。 本教程以案例教学为主,各章节都附有大量的实例,并且操作步骤详细,有利于引导读者更好的消化、理解和实际应用本章节所学的知识内容,希望大家能多多支持中国站长网络学院!