[讨论]请教高手:用指针求数组长度的算法?

INTTNY 2007-05-07 01:10:00
看下例;
void name()
{
int*array;
int num=count(...);
array=new int[num];
}
关于此数组array,由于array的长度取决于num,而num又是由用户在使用程序时随机操作后通过一系列计算产生的,是不可预测的。我想求此数组长度,怎么办呢?开始我想到使用sizeof(array),后来想了下又试了下,sizeof(array)只能求得此指针长度,求不到array数组实际长度。怎么办呢?

我想了下,考虑了以下办法:由于array的结尾地址是无法预测的,于是我在初始化的时候预先在p+num*sizeof(int)后加入连续的6个0,然后写个计数函数count(),碰到连续6个0就认为该数组完结,否则count++,具体如下:

int lengthof(int*array)
{
int*_array=array;//计算0个数时使用的数组
int len=0;//数组长度
int count=0;//0的个数的计数器
bool judge=false;//如果judge为真则已计算出数组长度
while(!judge)
{
if(*array)//若array不为0则数组长度+1
len++;
else
{
_array=array;
judge=true;
while(!judge&&count!=6)//进入判断是否拥有连续6个0
{
if(!(*_array))//*_array为0
count++;
else
judge=false;//6个0不连续,标志位为假
_array++;
}
if(count==6)
judge=true;
array++;
}
}

但是自己感觉这算法既不专业,又太繁。想请教一下各位高手有没有简单点的算法来实现这一功能?或者VC本身自带有什么函数可以调用?
...全文
1195 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk278518173 2010-08-25
  • 打赏
  • 举报
回复
额 我也学习了
INTTNY 2007-05-07
  • 打赏
  • 举报
回复
感谢各位高手的赐教,小弟现在知道该怎么做了
kuizoo 2007-05-07
  • 打赏
  • 举报
回复
根据你举的例子,实际上是不可能单靠指针array就得出array指向的数组大小的。你可以想一想,为什么C风格的字符串类型必须在最后加上'\0'符号呢?还不是因为单靠指针,不知道哪里才是字符串的结尾。
所以,在任何使用指针的场合,都应该给出对应的大小。
060 2007-05-07
  • 打赏
  • 举报
回复
TO eggqq007(

new 最后也调用了malloc
eggqq007 2007-05-07
  • 打赏
  • 举报
回复
CQZE(Say It Loudly And Proudly - 发颗药)
MSDN

找 _msize
=============================================
我觉得如果在这道题还可以用这种方法还可以,但是如果碰上要用new来初始化的类就不可以了。MSDN的原话是:
The _msize function returns the size, in bytes, of the memory block allocated by a call to calloc, malloc, or realloc.
但是在C++中建造类的对象要用new,用不了calloc,malloc和realloc.



yoyo_alex_lw 2007-05-07
  • 打赏
  • 举报
回复
最好的办法就是保存用户输入的num变量了,这样最简单,快速,高效,健壮
Allen_zhang 2007-05-07
  • 打赏
  • 举报
回复
一般的内存操作都是要同时将他的长度信息一起传递的
INTTNY 2007-05-07
  • 打赏
  • 举报
回复
如果VC没有配备直接求取函数动点手脚还是可以的,就比如上面我那函数,经试验确实可以求得长度。但太长又太繁了啦,想求个简单点的算法……
believefym 2007-05-07
  • 打赏
  • 举报
回复
除了char*(以'\0')结尾,其他的貌似不能通过指针获取长度吧
INTTNY 2007-05-07
  • 打赏
  • 举报
回复
MSDN
找 _msize
???
没看懂CQZE的。能说详细点吗?
CQZE 2007-05-07
  • 打赏
  • 举报
回复
MSDN

找 _msize
INTTNY 2007-05-07
  • 打赏
  • 举报
回复
有点疑问: “while(*a++!='\0') ”
这里,为什么可以用'\0'来做结尾标志呢?首先这数组指针并非字符指针,数组也非字符串数组,再一该数组非用户输入数组,这个'\0'是怎么得来的呢?请不吝赐教
expter 2007-05-07
  • 打赏
  • 举报
回复
template<class t>
void test(t *a)
{
int len=0;
while(*a++!='\0')
len++;

return len;
}
expter 2007-05-07
  • 打赏
  • 举报
回复
template<class t>
void test(t *a)
{
int len=0;
while(a!='\0')
len++;

return len;
}

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧