C++数组存储问题

bingyu_2008 2012-04-07 04:05:20
例如:int array[10],在内存中是连续存储的,但是其长度信息在哪里存放着,当使用sizeof的时候,sizeof是怎么知道array这个标识符是指向一个长度为10的int型数组的?
...全文
234 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
muyi66 2012-04-08
  • 打赏
  • 举报
回复
我在VS里测试,看到的块大小存储在指针所指位置前16个字节处,中间还有一些信息无从猜测意义。

存在栈里是不会保存数组大小信息的,就是堆里那个大小也不是给sizeof用的,而是给内存回收函数用的。
bingyu_2008 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
7#mingliang1212跟我想的差不多
LZ可以在调试程序的时候查看memory
可以发现在这个数组的首地址前有一段空间是‘空’着的
这个‘空’着的大小根据编译器的不同而不同
这段空间就存储了数组的相应信息
[/Quote]
我做过测试了,在堆里面分配时确实是这样的,但是在栈里面确不是这样,不存在保存数组大小的区域,在栈里分配数组时,其大小在什么地方存着呢?
useroflj 2012-04-07
  • 打赏
  • 举报
回复
7#mingliang1212跟我想的差不多
LZ可以在调试程序的时候查看memory
可以发现在这个数组的首地址前有一段空间是‘空’着的
这个‘空’着的大小根据编译器的不同而不同
这段空间就存储了数组的相应信息
bingyu_2008 2012-04-07
  • 打赏
  • 举报
回复
刚才做了个测试:
int a[10];
int a2[10];
cout << &a << endl;
cout << &a2 << endl;
int *p = new int[10];
p[9] = 11;
int *p2 = new int[10];
cout << &*p << endl;
cout << &p << endl;
cout << &*p2 << endl;
cout << &p2 << endl;
cout << *(p - 1) << endl;
cout << *(p2 - 1) << endl;
cout << *(p - 2) << endl;
cout << *(p2 - 2) << endl;
delete[] p;
delete[] p2;

结果是:
1245020
1244980
10051096
1245064
10051140
1245060
40
40
0
11
在栈里面分配时,a和a2这两个数组中间之连续存储的,两个数组首地址相差40字节。
在堆中分配时,p和p2所指向的数组中间相差44个字节,多出来的4字节里面存储的数字恰好是40,存贮的是数组的长度,与数组大小刚好吻合,将数组大小改成11后,同理。可以证明,在动态创建数组时,数组长度就存放在数组首地址前面4个字节里面。正如yuankangjian_2所说的。
那么在栈里面分配的数组大小究竟在哪里存着,或者是根本没有存,而是在编译时编译器就已经知道该怎么处理了?
iamnobody 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

那要是动态申请呢,例如:
int *p = new int[10];
那么删除它就要使用:
delete[] p;

delete[]又是怎样知道这个数组究竟有多大呢?不然它怎么知道要释放多少内存。
[/Quote]
这是与实现相关的,一般是在p 指向的内存之前保存一些信息.包括大小.C++是无法得到这一大小的,只有编译器知道怎么得到 .
yuankangjian_2 2012-04-07
  • 打赏
  • 举报
回复
应为数组分配是连续的,所以肯定有个东西记录其大小的,那个指针就在:开辟的数组的前面内存单元内,有个指针,表示其大小~~!
bingyu_2008 2012-04-07
  • 打赏
  • 举报
回复
那要是动态申请呢,例如:
int *p = new int[10];
那么删除它就要使用:
delete[] p;

delete[]又是怎样知道这个数组究竟有多大呢?不然它怎么知道要释放多少内存。
muyi66 2012-04-07
  • 打赏
  • 举报
回复
目标代码里没有数组长度的信息,但是源码里是有的。编译器在碰到sizeof时会从源代码里找到对应的定义,从而给出正确返回值。
iamnobody 2012-04-07
  • 打赏
  • 举报
回复
int array[10];

数组是一个类型.
上面的array 数组的类型是 int [10];

int [3] 和 int [4] 是不同的类型.

sizeof 根据类型来判断 大小.
_程序员 2012-04-07
  • 打赏
  • 举报
回复
大概是因为你给定了数组的长度吧,你可以用一个指针指向这个数组再用sizeof试下
自由建客 2012-04-07
  • 打赏
  • 举报
回复
sizeof 是编译期的东西,当然知道了!

64,650

社区成员

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

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