c语言中 数组的问题?

int arr[3] = {1,2,3}; 在内存中是一篇连续区域,且arr指向数组的首元素的地址,那么c是怎么记录arr数组的长度是多少呢?就是arr的长度保存在哪里?即c怎么知道从arr[0]后面有几个连续的地址?

这个问题和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. 这些都是程序最底层的逻辑。 如果不对,还希望大家交流。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-18
数组是静态的,你在声明的时候就已经给定了数组在内存中的大小,然后你在使用的时候系统会自动读出你的数组在系统中所占据的大小
第2个回答  2013-09-18
C语言不记录数组的长度。所以指向数组的指针在移动时必须要作越界检查,否则会造成不可预计的结果。
第3个回答  2013-09-18
通过int 就是定义了数组中每个元素的长度,又因为数组中所有元素都是int型的,长度相同,所以可以按照内存,通过首地址和元素个数,依次得到数组元素的值
第4个回答  2013-09-18
直到结束符\0,\0存储在这段连续地址的最后,相当于arr【3】的地址位置。所以遇到\0就代表数组结束了
第5个回答  2013-09-18
数组的长度,不是通过某个变量记录的,而是在数组的最后有个一个'\0'的终结符,通过这个去判断数据的长度
相似回答