参数策略

如果函数的参数是一个指针,不要指望用该指针去动态申请内存。如下:

void GetMemory(char *p, int num)
{p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{char *str = NULL;GetMemory(str, 100);     //str仍未NULLstrcpy(str, "hello");    //运行错误
}

原因是编译器总是为每个参数制作临时副本。指针参数p, 其副本为_p,使_p=p。如果改变了_p所指的内容,相应的p所指的内容也跟着改变(毕竟指向同样的地方)。但是在GetMemory中动态分配内存空间,改变了_p的内容。在调用函数中的p还是指向NULL。再者,因为函数GetMemory中动态分配了空间,但是没释放,这样调用一次函数,就泄露了一次内存。图示:

如果非得用指针参数申请内存,可以用指针的指针作为参数申请内存

void GetMemory(char **p, int num)
{*p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{char *str = NULL;GetMemory(&str, 100);     //记得加地址符   strcpy(str, "hello");        free(str)}

原理是一样的,比较难理解,图示表示:

比较好的方法是传指针的引用

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
void GetMemory(char *&p, int num)
{p = (char *)malloc(sizeof(char) * num);
}void Test(void)
{char *str = NULL;GetMemory(str, 100);strcpy(str, "hello");cout << str << endl;free(str);
}
int main()
{Test();
}

这里注意指针的引用 为char* &a,要是不好理解可以这样:

    typedef char* pchar;pchar &a

返回值策略

可以用函数返回值来传递动态内存。这中方法比“指针的指针”简单多了

char *GetMemory(int num)
{char *p = (char *)malloc(sizeof(char) * num);return p;
}
void Test(void)
{char *str = NULL;str = GetMemory(100);  //str指向了动态分配的空间strcpy(str, "hello"); free(str)}

在使用返回值时,千万别返回指向“栈内存”的指针、引用,因为该内存在函数结束时自动消亡了,返回的指针是个野指针了。例如

char *GetString()
{char p[] = "hello world"; //数组内容存储在栈区,函数结束时,会释放掉return p;
}
void Test(void)
{char *str = NULL;str = GetString();      //因为非配的内存早已释放掉,此时的str是个野指针,内容是垃圾cout << str << endl;}

在函数中不定义数组,定义指针,示例:

char *GetString()
{char *p = "hello world"; //数组内容存储在静态区,函数结束时,不会释放掉return p;
}
void Test(void)
{char *str = NULL;str = GetString();      cout << str << endl;}

此时的程序是正确的,但是有一点,此时分配的内存处于静态区,是只可以读取但是不可以修改的。

【c++】指针参数是如何传递内存的相关推荐

  1. c/c++中指针参数如何传递内存!

    内存的分配何管理一直让许多c++爱好者头痛不已,不仿看看下面的东西! 来自林锐的<高质量c++编程指南> 指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内 ...

  2. 关于用函数指针参数申请动态内存的问题

    今天在写一个Binary Search Tree的程序时,发现其插入有问题,下面是插入程序,每次插入完成后,节点还是NULL. template<typename Object> void ...

  3. 【C++基础学习】C++引用参数与指针参数

    引用和指针参数,这两种参数都允许函数修改实参,也都允许有效地向函数传递大型类对象.那么,怎么样决定把函数参数声明成引用还是指针呢? 引用必须被初始化为指向一个对象,而且一旦初始化了,就不能指向其他对象 ...

  4. c6011取消对null指针的引用_C++| 函数的指针参数如何传递内存?

    函数的参数是一个一级指针,可以传递内存吗? 如果函数的参数是一个一级指针,不要指望用该指针去申请动态内存. 看下面的实例: #include using namespace std; void Get ...

  5. C++指针参数如何传递内存?

    C++指针参数如何传递内存? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存.示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依 ...

  6. C 函数传递指针参数注意事项

    指针参数:这个问题也可以归结为内存泄漏.对于malloc的变量,free之后一定要置为NULL,这样我们就可以通过判断这个自增是否为NULL来编程.所以为了简单和不至于忘记最后的一个置NULL操作,我 ...

  7. c语言链表错误,C语言创建链表错误之通过指针参数申请动态内存实例分析

    本文实例讲述了C语言创建链表中经典错误的通过指针参数申请动态内存,分享给大家供大家参考之用.具体实例如下: #include #include // 用malloc要包含这个头文件 typedef s ...

  8. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  9. C语言中结构体参数变量的传递

    c语言  结构体  函数  参数  传递 一.前言 本文中的程序实现对员工信息结构体字段赋值并打印出来的功能.该结构体的定义如下: // 员工信息结构体 typedef struct {INT8 sz ...

最新文章

  1. [MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题
  2. 开启Mysql慢查询来优化mysql
  3. Event handling in Angular
  4. partial 分部类-庞大类的瘦身计划
  5. leetcode 721. 账户合并(并查集)
  6. win2003+IIS6+PHP5.3.8+MSSQL2008的安装配置
  7. postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)
  8. 细说.NET中的多线程 (四 使用锁进行同步)
  9. 电工学复习【7】-- 集成运算放大器
  10. ARM到底是一家什么样的公司?
  11. 详解百度大脑EdgeBoard出色的视频处理技术
  12. TypeScript 学习笔记
  13. php错误报告和调试
  14. 解决:IOS无法使用微软账号登录,显示“无法登录,请使用IMAP并重新登录“
  15. 制作linux包 u盘安装
  16. Android小代码
  17. 计算机英语复试自我介绍,计算机复试英语自我介绍
  18. vpb输出范围地形命令
  19. 图谱实战 | ​鲍捷:知识图谱技术在金融领域的分析和应用
  20. C++基础升华:编写的中国象棋源码

热门文章

  1. DB2 XQuery学习笔记
  2. String和StringBuilder
  3. gil php,网络编程之多线程——GIL全局解释器锁
  4. string 相等 java_java中String相等问题
  5. 优化自定义函数_10分钟教你手写8个常用的自定义hooks
  6. 开放平台架构_三步画出产品业务架构图
  7. 简述Linux目录结构和系统结构
  8. 关于MySQLdb连接数据的使用(插入数据,删除数据,更新数据,搜索数据——前端页面完成这些对数据库的操作)
  9. C语言中降序qsort通用写法
  10. HDU7059-Counting Stars 线段树 (区间加最低位置,区间减最高位)