社区
C++ 语言
帖子详情
C++数组存储问题
bingyu_2008
2012-04-07 04:05:20
例如:int array[10],在内存中是连续存储的,但是其长度信息在哪里存放着,当使用sizeof的时候,sizeof是怎么知道array这个标识符是指向一个长度为10的int型数组的?
...全文
234
11
打赏
收藏
C++数组存储问题
例如:int array[10],在内存中是连续存储的,但是其长度信息在哪里存放着,当使用sizeof的时候,sizeof是怎么知道array这个标识符是指向一个长度为10的int型数组的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 是编译期的东西,当然知道了!
C++
一维
数组
二维
数组
写入txt,从txt中读取数据存到一维
数组
二维
数组
用
C++
语音实现一维
数组
二维
数组
写入txt,从txt中读取数据存到一维
数组
、二维
数组
,
数组
用指针表示
C++
数组
实现二叉树的
存储
及基本操作
数据结构之使用
C++
语言中的
数组
实现二叉树的
存储
及其基本操作
数据结构基础系列(5):
数组
与广义表
数据结构课程是计算机类专业的专业基础课程,在IT人才培养中,起着重要的作用...系列课程包含11个部分,本课为第5部分串,介绍
数组
的基本概念,特殊矩阵的压缩
存储
及基本运算的实现,以及广义表及其
存储
和相关的算法。
二叉树的
数组
存储
结构
c++
实现二叉树的
数组
存储
,代码很简单,参考即可
C/
C++
数组
和指针及引用的区别
C/
C++
数组
和指针及引用的区别 1.
数组
和指针的区别 (1)定义
数组
是一个符号,不是变量,因而没有自己对应的
存储
空间。但是,指针是一个变量,里面
存储
的内容是另外一个变量的地址,因为是变量所以指针有自己的...
C++ 语言
64,650
社区成员
250,478
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章