CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

能否得到new或者malloc分配的数组长度?

楼主junglesong(除了代码,一无所有。)2003-12-02 11:55:35 在 C/C++ / C语言 提问

代码实例如下:  
  char   *p;  
  p=new   char[10];  
   
  在程序中想要得到10这个数组长度的话,有什么办法吗? 问题点数:20、回复次数:16Top

1 楼fierygnu(va_list)回复于 2003-12-02 12:12:19 得分 1

没办法。p不是数组。Top

2 楼program2100(>>对于火星程序员来说 地球de工作很辛苦<<)回复于 2003-12-02 12:23:07 得分 0

拜托,不知道数组长度怎么申请分配?Top

3 楼hawkxjy(developer)回复于 2003-12-02 12:38:08 得分 1

可以这样试试:  
  int   i   =   0;  
  char   *temp   =   p;  
  while(temp!=NULL)  
  {  
      i++;  
      temp+   =   1;  
  }  
         
  Top

4 楼fierygnu(va_list)回复于 2003-12-02 13:24:41 得分 1

hawkxjy(developer),什么是NULL?怎么才能从1数到0?每次+1吗?  
  Top

5 楼hanyixin(怡)回复于 2003-12-02 13:38:00 得分 1

 
  这个方法是错误的,不能这样用,new到的空间里是乱码。  
  要得到这个长度,可以根据不同的编译器采用一些非常的方法来得到,但是不能移植。  
   
  Top

6 楼flyback(墨羽)回复于 2003-12-02 13:39:34 得分 0

基础知识没打好,先看看书Top

7 楼xfxia(毛毛虫)回复于 2003-12-02 13:41:29 得分 1

如果是用用malloc申请的内存,可以用_msize函数得到申请内存的大小,从而得到申请的数组的大小。Top

8 楼zhangfjj(小张)回复于 2003-12-02 14:02:13 得分 0

代码实例如下:  
  char   *p;  
  p=new   char[10];  
  ----------------  
  sizeof(char[10])/sizeof(char)  
  用你先new申请的类型大小除以sizeof(char),  
  呵呵。。。骑驴找驴。Top

9 楼psbeond(LibUIDK界面库客服)回复于 2003-12-02 14:49:37 得分 5

据我所知没办法得到的,使用malloc或new分配内存的原理是这样的:  
  如果你申请16个char的空间时,malloc或new给你从堆上分配16个char的空间,并在这个空间的前面存放这个长度,以便于在free或delete这个空间时知道空间大小,但这个长度我们是看不到的,只有编译器知道。  
            _______  
          |______|  
  p-->|__5___|  
          |__..._|  
          |__..._|  
          |__..._|  
          |     ...   |  
  上面的5表示分配了5个空间,但p指向5的后面  
  所以根据上面的分析,下面的程序虽然能编译通过,但是运行时会出问题的:  
  char   *sp   =   new   char[32];  
  delete   []   sp+16;  
  上面的程序的想法是想分配32个char的空间之后把这32个空间的后16个空间释放,但在sp+16的前面没有一个空间长度记录,所以释放失败.Top

10 楼november5(void)回复于 2003-12-02 14:55:37 得分 4

不知道有什么方法,即使有也不推荐,  
  推荐把缓冲区指针和大小,一起传递,  
  或者自己重新封装成新的结构Top

11 楼Maxwell(不可知)回复于 2003-12-02 14:59:09 得分 1

它会不会把sp+16前面的值当成长度,然后释放掉,然后出现莫名其妙的错误呢?Top

12 楼junglesong(除了代码,一无所有。)回复于 2003-12-02 20:15:52 得分 0

谢谢大家的回复,csdn真是高手好人多啊!  
   
  我问这个问题是因为在编写一个类似vb中redim   preserver   arr(0   to   n)这样的函数,函数编写完后别人提出了一个测试的问题,他说我用输出的办法并不很让人信服,毕竟长度是我人为在函数中加入的,除了看代码,别人无法知道是否多分配了空间而造成浪费,并说要是有一个类似vb中的ubound90函数那样的东西来检测它,而且这个函数还可以帮助其他函数在不需要访问某变量的情况下得到数组的长度,十分方便,我觉得也有道理,但一时无法解决,于是上来问问大家有什么好办法。并非一些同志说的骑驴找驴,呵呵。  
   
  vb也是用c/c++实现的,ubound90函数也肯定能被实现出来,请大家集中在这里讨论吧。  
   
  最后谢谢每个同志的帮助。Top

13 楼Maxwell(不可知)回复于 2003-12-02 21:08:05 得分 5

办法是有,不过想用语言自有的类型恐怕是没戏的,除非自己实现。vb的数组一定在什么地方记录了大小,或者从某处查到的大小。最起码从理论上c++不能实现你要的功能吧。你要想知道可以写一套函数在调试状态时自动记录大小,正式版本的时候去掉,这样就可以了。Top

14 楼glacierrr(冰河纪的怪鸟)回复于 2003-12-02 21:15:42 得分 0

在c/c++里只能像zhangfjj(小张)   所说了:  
   
  void   main()  
  {  
  char   *p;  
  p   =   new   char[10];  
  int   x   =   sizeof(char[10])/sizeof(char);  
  }  
   
  如果用  
  int   x   =   sizeof(*p)/sizeof(char);  
  则结果为sizeof(char)/sizeof(char)   =   1  
   
  如果用  
  int   x   =   sizeof(p)/sizeof(char);  
  则结果为sizeof(指针)/sizeof(char)   =   4  
  Top

15 楼junglesong(除了代码,一无所有。)回复于 2003-12-03 20:22:31 得分 0

在大家的帮助下,我已经基本弄清楚了问题的实质,现在可以揭贴了,谢谢大家。Top

16 楼psbeond(LibUIDK界面库客服)回复于 2003-12-05 11:34:33 得分 0

谢谢xfxia(毛毛虫)   的方法,果然好使,澄清了我直到现在的一个疑问,再次谢谢Top

相关问题

  • 数组长度
  • 数组长度和数组排序
  • 二维数组动态分配,已知第二维的长度,第一位是动态的
  • 问题:求数组长度
  • 求数组的长度?
  • 一个数组的长度
  • 数组长度的问题
  • 数组长度的问题
  • 数组动态分配???
  • 如何改变数组长度,或设置数组长度?

关键词

  • c/c++
  • 函数
  • 内存
  • 代码
  • 数组
  • 长度
  • 空间
  • 大小
  • 得到
  • 谢谢

得分解答快速导航

  • 帖主:junglesong
  • fierygnu
  • hawkxjy
  • fierygnu
  • hanyixin
  • xfxia
  • psbeond
  • november5
  • Maxwell
  • Maxwell

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

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