int arr[3] = {1,2,3}; 在内存中是一篇连续区域,且arr指向数组的首元素的地址,那么c是怎么记录arr数组的长度是多少呢?就是arr的长度保存在哪里?即c怎么知道从arr[0]后面有几个连续的地址?
int a[3];
printf("-->%d",sizeof(a));
可是上面的语句能打印出12,如果不知道边界,这个12是怎么计算出来的呢?
Good question.
长度是不被保存的。但是硬件在做空间分配的时候,内存地址哪些已经分配出去了,剩下多少空间等信息是会被纪录的。 要不然的话 编译器就可能把同一块内存地址 给两个数据。这样就出错了。 所以总结一下就是,编译后的程序会纪录 每一个数据的起始地址。如果数据过大,比如你分配了一个指针是2MB, 如果这2MB 在内存中不是连续的。程序还会纪录中间连接的地址。 比较两个相邻的数据起始地址。就可以计算出 分配的size. 这些都是程序最底层的逻辑。 如果不对,还希望大家交流。