| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6725 人关注过本帖
标题:一个动态的指针数组怎样获得长度?
只看楼主 加入收藏
蓝天飞鸿
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-10-2
收藏
 问题点数:0 回复次数:7 
一个动态的指针数组怎样获得长度?
请问各位大侠,对于一个动态的指针数组,怎样能获得它的长度?
谢谢!
搜索更多相关主题的帖子: 指针 动态 长度 
2006-10-02 16:45
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
规范的用个计数器

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-10-03 19:13
corrupt
Rank: 2
等 级:新手上路
威 望:3
帖 子:535
专家分:0
注 册:2004-9-29
收藏
得分:0 

在debug 下 可以解决,但是在release 模式下 不知道如何解决~~
#include<iostream>
using namespace std;

int GetNewBufferSize(void *p)
{
if ( p )
return *(int*)((char *)p-16);
else
return 0;
}


int main()
{
int *arry=new int [10];
for(int i=0;i<10;i++)
arry[i]=0;
cout<<GetNewBufferSize(arry)/sizeof(arry[0]);
delete []arry;
return 0;
}


2006-10-04 07:46
sunzhuofeng
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-6-27
收藏
得分:0 

楼上的仁兄,能不能解释一下debug、release模式是什么。及*(int*)((char *)p-16)是什么原理?

2006-10-04 20:15
corrupt
Rank: 2
等 级:新手上路
威 望:3
帖 子:535
专家分:0
注 册:2004-9-29
收藏
得分:0 
vc6.0 常用的 调试模式 叫做 debug ... 它产生的.exe文件 只能在安装了vc的机器上运行
release 是发行版,,当你的程序 想在别人的机器(没安装vc)运行时 ,使用release 模式...

*(int*)((char *)p-16) 原理就是, 当 动态分配 时,会在分配的指针地址前16位,保存一个
数来 记录分配的大小.... debug 下为16位,但是release 下不知道是多少位

2006-10-04 21:21
蓝天飞鸿
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-10-2
收藏
得分:0 
非常感谢corrupt,在您的帮助下,这个问题正在得到解决!非常感谢!
2006-10-05 21:50
蓝天飞鸿
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-10-2
收藏
得分:0 
另外还想请问一下corrupt兄,既然在分配时前16位存储了分配的内存的大小,那么我们能不能有什么办法直接将前16位中的数读出来?如果能的话,那么就可以直接获得指针数组的长度了。

对于*(int *)((char *)p - 16)这个表达式的理解还是有点不太明白。(char *)p 是将任意指针类型的指针p转化成char指针类型,从而获得包括数组本身和前16位在内的整个数组的总位数,且最小单元为 1 位(而不是2位,4位或者8位),然后再将前16位刨除,就是数组本身的净位数。随后将这个净位数用int指针的最小单元去分解(int *),转化成整型指针。那么,对于(int *)((char *)p - 16)这样一个整型指针进行解引用是什么含义?

(由于我本人刚刚开始这方面的工作,以上问题有不对的地方还请海涵!)
2006-10-05 23:31
corrupt
Rank: 2
等 级:新手上路
威 望:3
帖 子:535
专家分:0
注 册:2004-9-29
收藏
得分:0 
首先更正: 是 16个字节不是 16位...... 让你带来了误解...
原本将一个int 的指针 变为char指针 是为了 方便 -16个字节 .... (因为如果int 指针 -1的话是移动4个字节)

(int *)((char *)p - 16)这样一个整型指针进行解引用是什么含义?

方便啊.. 如果你动态分配的 指针类型不是 int 型的, 而是double 型呢??
那么(int *)((char *)p - 16) 仍然 适用.......



2006-10-06 07:54
快速回复:一个动态的指针数组怎样获得长度?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045498 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved