能否得到new或者malloc分配的数组长度?
代码实例如下:
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




