[讨论]:用指针求数组长度的算法
[讨论]请教高手:用指针求数组长度的算法?
看下例;
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本身自带有什么函数可以调用?
------解决方案--------------------
template <class t>
void test(t *a)
{
int len=0;
while(a!= '\0 ')
len++;
return len;
}
------解决方案--------------------
MSDN
找 _msize
------解决方案--------------------
除了char*(以 '\0 ')结尾,其他的貌似不能通过指针获取长度吧
------解决方案--------------------
一般的内存操作都是要同时将他的长度信息一起传递的
------解决方案--------------------
最好的办法就是保存用户输入的num变量了,这样最简单,快速,高效,健壮
------解决方案--------------------
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.
------解决方案--------------------
TO eggqq007(
new 最后也调用了malloc
------解决方案--------------------
根据你举的例子,实际上是不可能单靠指针array就得出array指向的数组大小的。你可以想一想,为什么C风格的字符串类型必须在最后加上 '\0 '符号呢?还不是因为单靠指针,不知道哪里才是字符串的结尾。
所以,在任何使用指针的场合,都应该给出对应的大小。
看下例;
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本身自带有什么函数可以调用?
------解决方案--------------------
template <class t>
void test(t *a)
{
int len=0;
while(a!= '\0 ')
len++;
return len;
}
------解决方案--------------------
MSDN
找 _msize
------解决方案--------------------
除了char*(以 '\0 ')结尾,其他的貌似不能通过指针获取长度吧
------解决方案--------------------
一般的内存操作都是要同时将他的长度信息一起传递的
------解决方案--------------------
最好的办法就是保存用户输入的num变量了,这样最简单,快速,高效,健壮
------解决方案--------------------
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.
------解决方案--------------------
TO eggqq007(
new 最后也调用了malloc
------解决方案--------------------
根据你举的例子,实际上是不可能单靠指针array就得出array指向的数组大小的。你可以想一想,为什么C风格的字符串类型必须在最后加上 '\0 '符号呢?还不是因为单靠指针,不知道哪里才是字符串的结尾。
所以,在任何使用指针的场合,都应该给出对应的大小。