CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

为什么不能这样传递指针

楼主cxmcqu2000(冷静燃烧)2004-09-03 10:49:39 在 VC/MFC / 基础类 提问

void   GetMemory(char   *p)  
  {  
  p=(char   *)new   char[100];  
  }  
  int   main(int   argc,   char*   argv[])  
  {  
                    char   *str=NULL;  
  GetMemory(str);  
  strcpy(str,"hello");     //非法内存  
   
  printf("str:%s\n",str);  
  getchar();  
  return   0;  
  } 问题点数:20、回复次数:20Top

1 楼kvls(冰茶)回复于 2004-09-03 10:52:40 得分 2

void   GetMemory(char   *p)修改为void   GetMemory(char   *&p)Top

2 楼pomelowu(羽战士)回复于 2004-09-03 10:57:58 得分 2

用指针的指针,或者这样理解,用指向一个字符串的指针  
  void   GetMemory(char   **   p);  
   
  GetMemory(&str);Top

3 楼McuPlayer(编程浪子)回复于 2004-09-03 11:02:33 得分 2

为什么放着好好的简单办法不用?  
  char*   GetMemory()  
  {  
  return   (char   *)new   char[100];  
  }  
  Top

4 楼autoegg(哲学指引生活 && (动心忍性,增益其所不能))回复于 2004-09-03 11:19:23 得分 2

还是推荐McuPlayer(编程浪子)的方法,这是最常用的。Top

5 楼kvls(冰茶)回复于 2004-09-03 11:37:46 得分 2

不,推荐使用void   GetMemory(char   *&p)或者void   GetMemory(char   **p)Top

6 楼Paris_Luo(不懂)回复于 2004-09-03 11:42:01 得分 2

改成这样,用指针引用  
  void   GetMemory(char   *   &p)  
  {  
  p=(char   *)new   char[100];  
  }Top

7 楼weakwater(我是河南人)回复于 2004-09-03 12:08:28 得分 0

关注  
   
  有人解释一下楼主怎么错了吗?Top

8 楼wjjssnew(暗恋一个叫张文玲的女孩)回复于 2004-09-03 12:52:36 得分 0

推荐   编程浪子的方法..  
  方便以后排错..养成好习惯也很重要啊:)Top

9 楼ZHANG9652(剑神独孤求败)回复于 2004-09-03 13:16:26 得分 2

void   GetMemory(char   *p)  
  记得高质量c++编程指南上好像是这么说的,形参char   *p,在程序体内,编译器实际上是会产生一个替代的临时变量比如pp去代这个变量,所以  
  p=(char   *)new   char[100];  
  实际是pp=(char   *)new   char[100];  
  所以开辟的动态内存与p是没啥关系的,  
  也许俺记错了,但是我一般都是用双重指针来做这事的Top

10 楼pomelowu(羽战士)回复于 2004-09-03 13:17:02 得分 2

各位,new的时候有可能内存出错,都没有考虑的。不管哪种返回方式,都需要考虑这个才是好的方式。  
   
  “有人解释一下楼主怎么错了吗?”  
   
  因为  
  GetMemory(str);Top

11 楼pomelowu(羽战士)回复于 2004-09-03 13:19:29 得分 2

汗~~~还没写完呢~~~  
  因为:  
  GetMemory(str);             //把str传进去,str是一个指针,而他实际上是一个int  
   
  void   GetMemory(char   *p)     //   p是str的一个副本  
  {  
  p=(char   *)new   char[100];         //   p的值改变,但是str的值并没有改变。  
  }  
  Top

12 楼crybird(寒号鸟)回复于 2004-09-03 13:21:58 得分 0

ZHANG9652(剑神独孤求败)   正解  
   
  提示:只有new,没有delete么Top

13 楼pomelowu(羽战士)回复于 2004-09-03 13:22:21 得分 0

而双重指针为什么就可以了呢:  
   
  GetMemory(&str);             //把str的地址传进去  
   
  void   GetMemory(char   **   p)     //   p是str地址的一个副本  
  {  
  *p   =   (char   *)new   char[100];         //   p指向的值改变,也就是str的值改变。  
  }Top

14 楼iicup(双杯献酒)回复于 2004-09-03 13:24:05 得分 2

楼主错误在于,他认为  
  void   GetMemory(char   *p);  
  中的p“就是”  
  GetMemory(str);  
  中的str  
  但p“不是”str,它只是“等于”str  
   
  就象:  
  int   a   =   100;  
  int   b   =   a;//   现在b等于a  
  b   =   500;     //   现在能认为a   =   500   ?  
   
  显然不能认为a   =   500,因为b只是等于a,但不是a!  
  当b改变的时候,a并不会改变,b就不等于a了。  
   
  因此,虽然p已经有new的内存,但str仍然是null  
   
  Top

15 楼pomelowu(羽战士)回复于 2004-09-03 13:26:51 得分 0

楼上说的是,还有就是如果按楼主以前的代码,p会在函数返回的时候销毁,但是分配的空间却仍然存在,没有办法delete。Top

16 楼allenq(黑夜给我黑的眼, 我却用他来翻白眼..........)回复于 2004-09-03 13:33:27 得分 0

答:程序崩溃。  
  因为GetMemory   并不能传递动态内存,  
  main   函数中的str   一直都是NULL。  
  strcpy(str,   "hello   world");将使程序崩  
  溃。Top

17 楼iamzxx()回复于 2004-09-03 14:18:37 得分 0

执行GetMemory(str);时系统分配了临时内存用于p=(char   *)new   char[100];  
  函数返回时,临时内存清除,该指针丢失.而STR还是为NULL  
  Top

18 楼iamzxx()回复于 2004-09-03 14:23:50 得分 0

GetMemory(char   *p)  
  改为GetMemory(char   **p)  
  Top

19 楼McuPlayer(编程浪子)回复于 2004-09-15 22:56:48 得分 0

1、指针是C的精华  
  2、程序简单最美Top

20 楼dhbo(沉默的石头)回复于 2004-09-16 12:40:24 得分 0

应该说,搂主还是值传递的  
  str=   NULL   ;这个现实一直没有变过,而:  
  void   GetMemory(char   *p)  
  {  
  p=(char   *)new   char[100];  
  }  
  只是改变的str得一个拷贝的内存的变化,在这个函数调用过后,*p会释放,但是new的内存没有释放,会有内存泄漏  
  如果用    
              void   GetMemeory(char   *&p)    
              是引用传递,指向的是同一快内存区域,这样会成功的  
              而  
              void   GetMemory(char   **p)   ;  
            是地址的传递,也会成功  
  Top

相关问题

  • 为什么在C++中不能通过指针传递呢???
  • 为什么不能移动指针?
  • 函数中指针参数传递问题:为什么无法传递指针参数?
  • 我在构造函数中传递了一个adoquery的指针给new出来的一个form2,为什么不能再form2中使用了?
  • 不能通过sendmessage传递结构的指针吗??????????????
  • 为什么不能传递参数?
  • 为什么不能传递参数?
  • 为什么void* 指针不能复引用?
  • VC中指针为什么不能人为移动
  • 为什么我不能正常释放指针?

关键词

  • 指针
  • 内存
  • 函数
  • null
  • getmemory
  • 传递
  • str
  • 改变
  • 编程
  • 指向

得分解答快速导航

  • 帖主:cxmcqu2000
  • kvls
  • pomelowu
  • McuPlayer
  • autoegg
  • kvls
  • Paris_Luo
  • ZHANG9652
  • pomelowu
  • pomelowu
  • iicup

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo