c语言中 数组的问题?

intarr[3]={1,2,3};在内存中是一篇连续区域,且arr指向数组的首元素的地址,那么c是怎么记录arr数组的长度是多少呢?就是arr的长度保存在哪里?即c怎么... int arr[3] = {1,2,3}; 在内存中是一篇连续区域,且arr指向数组的首元素的地址,那么c是怎么记录arr数组的长度是多少呢?就是arr的长度保存在哪里?即c怎么知道从arr[0]后面有几个连续的地址? 展开
 我来答
SamTWang
2013-09-18 · TA获得超过340个赞
知道小有建树答主
回答量:76
采纳率:0%
帮助的人:108万
展开全部
这个问题和c语言的编译器有关。
1.那么c是怎么记录arr数组的长度是多少呢?
这个arr的长度是被算出来的,int说明一个数据的长度为32bit,也就是4个字节。 [3]表示有3个这样的数据类型。所以是12个字节。 编辑器会算出,并分配空间。

2.就是arr的长度保存在哪里?即c怎么知道从arr[0]后面有几个连续的地址?
长度是不被bao 保存的。只是在分配的时候会算出来,并使用。 一旦分配完空间,实际上被纪录的只有一个指针的地址。 所以在用指针地址访问空间的时候要特别注意。地址不要出错,或者越界。
追问
int a[3];
printf("-->%d",sizeof(a));
可是上面的语句能打印出12,如果不知道边界,这个12是怎么计算出来的呢?
追答
Good question.
长度是不被保存的。但是硬件在做空间分配的时候,内存地址哪些已经分配出去了,剩下多少空间等信息是会被纪录的。 要不然的话 编译器就可能把同一块内存地址 给两个数据。这样就出错了。 所以总结一下就是,编译后的程序会纪录 每一个数据的起始地址。如果数据过大,比如你分配了一个指针是2MB, 如果这2MB 在内存中不是连续的。程序还会纪录中间连接的地址。 比较两个相邻的数据起始地址。就可以计算出 分配的size. 这些都是程序最底层的逻辑。 如果不对,还希望大家交流。
操羽40
2013-09-18 · TA获得超过430个赞
知道小有建树答主
回答量:374
采纳率:100%
帮助的人:242万
展开全部
数组是静态的,你在声明的时候就已经给定了数组在内存中的大小,然后你在使用的时候系统会自动读出你的数组在系统中所占据的大小
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
virges
2013-09-18 · TA获得超过863个赞
知道小有建树答主
回答量:398
采纳率:50%
帮助的人:202万
展开全部
C语言不记录数组的长度。所以指向数组的指针在移动时必须要作越界检查,否则会造成不可预计的结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
慕桖寻绿3A
2013-09-18 · TA获得超过160个赞
知道答主
回答量:101
采纳率:0%
帮助的人:58.4万
展开全部
通过int 就是定义了数组中每个元素的长度,又因为数组中所有元素都是int型的,长度相同,所以可以按照内存,通过首地址和元素个数,依次得到数组元素的值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一路清晨503
2013-09-18 · TA获得超过228个赞
知道小有建树答主
回答量:413
采纳率:100%
帮助的人:258万
展开全部
直到结束符\0,\0存储在这段连续地址的最后,相当于arr【3】的地址位置。所以遇到\0就代表数组结束了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
m191007
2013-09-18
知道答主
回答量:32
采纳率:0%
帮助的人:9.4万
展开全部
数组的长度,不是通过某个变量记录的,而是在数组的最后有个一个'\0'的终结符,通过这个去判断数据的长度
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式