这是一个关于C++指针的问题,思考了一下

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");  //运行错误

}

这个p等同于指针值传递,只是将p的值传递进去,然后申请内存

编译器会为函数每个参数制作临时副本,p的副本_p = p;

如果函数体修改了_p的内容,就导致p的内容也相应修改。

如果不修改_p,p也不变。反而每执行一次就泄露一块内存。

void GetMemory2(char **p, int num){

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

}

void Test2(void){

  char *str = NULL;

  GetMemory(&str,100);//参数是&tr

  strcpy(str,"hello");

  cout<<str<<endl;

  free(str);

}

这是使用指向指针的指针来申请内存的,理解参考:http://www.cnblogs.com/dzry/archive/2011/05/12/2044835.html

这里p相当于指向了str,p申请了内存就相当于str申请了内存,个人觉得有点难理解

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);

}

这个就是在堆中申请了一段内存,然后返回给str,对于堆,栈,静态区的理解参考:http://my.oschina.net/liangtee/blog/126728

在GetMemory3中free(P)后,程序还是可以运行的,所以个人觉得free()释放内存是程序运行解释之后的,而不是马上就在函数运行是释放

参考:http://www.bccn.net/Article/kfyy/cyy/jszl/200608/4238_2.html

char *GetString(void){

  char p[] = "hello world";

  return p;//编译器出错

}

void Test4(void){

  char *str = NULL;

  str = GetString();//乱码

  cout<<str<<endl;

}

返回的p被系统回收了,所以是野指针。因为这里是栈申请的存储空间。

char *GetString2(void){

  char *p = "hello world";

  return p;

}

void Test5(void){

  char *str = NULL;

  str = GetString2();

  cout<<str<<endl;//输出hello world

}

p申请的是字符串常量,所以指针不变。  

对指针又加深了一点点了解

参考于: C++高质量编程指南

C++指针内存的更多相关文章

  1. C语言 二级指针内存模型混合实战

    //二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #i ...

  2. C语言 二级指针内存模型③

    //二级指针内存模型③ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #incl ...

  3. Objective-C 【多个对象内存管理(野指针&内存泄漏)】

    ------------------------------------------- 多个对象内存管理(野指针&内存泄漏) (注:这一部分知识请结合"单个对象内存管理"去 ...

  4. Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏

    Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题   今天使用Analyze 看了下项目,   解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...

  5. Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

    2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...

  6. 在用free()函数释放指针内存时为何要将其指针置空

    在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题.释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将 ...

  7. C语言 二级指针内存模型②

    //二级指针第二种内存模型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #incl ...

  8. C语言 二级指针内存模型①

    //二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素 ...

  9. C/C++指针内存分配小细节

    char *pc = NULL; pc = new char[0]; pc[0] = '1'; 相信初学者看见上面这段代码,都会觉得奇怪,new char[n]中的n指定给指针变量分配多少内存空间,而 ...

随机推荐

  1. Linux系统查看系统是32位还是64位方法总结【转】

    转自:http://www.cnblogs.com/kerrycode/p/3785768.html 这篇博客是总结.归纳查看Linux系统是32位还是64位的一些方法,很多内容来自网上网友的博客.本 ...

  2. ASP+Access UTF-8 网页乱码问题解决办法

    用ACCESS数据库和ASP做网站时用UTF-8编码有时会出现乱码,再者网页出错或者刷新页面后就是乱码,如果数据库取值乱码在开头加上<%@LANGUAGE="VBSCRIPT" ...

  3. 将helps.php或者functions.php直接进行了加载

    TP3系列中functions.php文件默认其实是空文件,很好找.我们可以直接封装代码. Laravel5系列中的path/vendor/laravel/framework/src/Illumina ...

  4. PHP给图片加文字(水印)

    准备工作: 代码: <?php header("Content-type: image/jpeg"); //浏览器输出,如不需要可去掉此行 $im = @imagecreat ...

  5. CGRectGet系列

    CGRectGetHeight返回label本身的高度 CGRectGetMinY返回label顶部的坐标 CGRectGetMaxY 返回label底部的坐标 CGRectGetMinX 返回lab ...

  6. ios tabbar 文字位置

    [nav.tabBarItem setTitlePositionAdjustment)];

  7. EffectiveJava笔记(第一部分)

    考虑用静态构造方法代替构造器的好处: 1.静态构造方法有名字     BigInteger.probablePrime(int, int, Random)比 new BigInteger(int, i ...

  8. Database

    1.Mysql 本地计算机登陆mysql,(DOC界面)mysql -h 127.0.0.1 -u root -p

  9. sql 百万级数据库优化方案

    转自http://blog.sina.com.cn/s/blog_724cd89d0100ppcz.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  10. 免费PHP WEB环境套件介绍

    PHPNOW--Apache + PHP + MySQL(windows) easyphp--Apache + PHP + MySQL+phpmyadmin(windows) xampp(中文站点)- ...