这是一个关于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. Spring使用p名称空间配置属性

    给XML配置文件"减肥"的另一个选择就是使用p名称空间,从 2.0开始,Spring支持使用名称空间的可扩展配置格式.这些名称空间都是基于一种XML Schema定义.事实上,我们 ...

  2. eclispse快捷操作

    1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shift+F2 显示搜索对话框:Ctrl+H快速O ...

  3. 【Pro ASP.NET MVC 3 Framework】.学习笔记.5.SportsStore一个真实的程序

    我们要建造的程序不是一个浅显的例子.我们要创建一个坚固的,现实的程序,坚持使它成为最佳实践.与Web Form中拖控件不同.一开始投入MVC程序付出利息,它给我们可维护的,可扩展的,有单元测试卓越支持 ...

  4. oracle VS postgresql系列-行列转换

    [需求]例如先有数据为 id | name ------+--------- | lottu | xuan | rax | ak | vincent 现在需要转换为 id | names ------ ...

  5. 三种用于select 的选择器

    <html lang="en"> <head> <meta charset="utf-8"> <title>选项 ...

  6. 【转】Eclipse Console 加大显示的行数,禁止弹出

    转载地址:http://blog.csdn.net/leidengyan/article/details/5686691 Eclipse Console 加大显示的行数: 在 Preferences- ...

  7. YTU 2295: KMP模式匹配 一(串)

    2295: KMP模式匹配 一(串) 时间限制: 1 Sec  内存限制: 128 MB 提交: 32  解决: 22 题目描述 求子串的next值,用next数组存放,全部输出 输入 输入一个字符串 ...

  8. HTML学习之canves元素

    1:绘制画布 和在画布上绘制矩形 <!DOCTYPE html> <html> <head lang="en"> <meta charse ...

  9. OracleHelper

    /// <summary> /// OracleServer数据库访问的通用工具类 /// </summary> public abstract class OracleHel ...

  10. Python学习笔记-Day2-Python基础之字符串操作

    字符串的常用操作包括但不限于以下操作: 字符串的替换.删除.截取.复制.连接.比较.查找.分割等 这里将对字符串的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 ...