c语言超出数组长度赋值

main()
{
int a[3]={1,2,3};

 a[8]=5;
printf("\n%d\n",sizeof(a)/sizeof(int));
getchar();
}
上面这段代码为什么显示的长度还是为3呀?我想知道,我定义的数组长度本来是3,再在下标为8的地方再给它赋值,这样系统也是允许的。这很定有问题但我不知道是什么问题,请高手解答!!!

因为 a 你定义的就是一个三个int长度的数组,你检查a的长度,系统告诉你的是 a 这个类型的长度,就如你获取int类型的长度。
至于越界的问题,C语言是不会检查你下标是否越界的。数组在内存中是一段连续的空间,当你使用下标 0 访问,访问到的是第一个元素,使用 1 访问得到第二个,如此这般。你定义一个3长度的数组,却访问到第9个单位去,这个地方已经不属于你定义的范围了。如果你修改的这个范围外的元素有在其它地方被使用到,就可能发生错误。

这个在你学习指针后会更明白追问

  我想知道的是,既然已经定义了数组长度,怎么工再取数组下标为8的时候,这部分空间应该是没有得到系统的分配的,按理就会出现系统错误才对呀

追答

你怎么知道没有分配呢?比如你再定义个double b,就可能使用了这段空间

追问

因为我定义界限就是3个int类型长度,难道,只要定义一下数组类型那么它的长度就是不确定的吗?我希望您能给我解释清楚点,谢谢您了!

追答

定义一个数组,开辟一段内存空间,这段内存空间并不会像被围墙围住一样被封死,合理地利用这个数组,需要程序员自己控制。只定义了这段空间,只有这段空间内的数据对于你当前的程序是合理的,越界的话就不知道你访问到哪里去了,它可能属于机器上任何一个运行着的进程,因为机器上的进程使用的都是这一条内存。如果你修改了你越界访问到的数据,可能会造成未知的错误。

int a[3] = {1,2,3};这样的定义,a表示的是开辟的这一段空间的首地址,[]里的数字表示相对这个地址的偏移量,访问数组是这样进行的

你可以通过sizeof()获得某个类型的大小,但是程序运行时不会去检查下标是否越界。这样的检查是需要耗费资源的,理想的情况下,这样做对于程序运行也没有意义。C/C++没有这样做这样的检查,C# 、java 都是有这样的检查的

追问

   好的,非常感谢你的耐心解答谢谢你了!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-02
C语言规定,数组使用时,不对数组下标越界进行检查。
数组越界有时会导致程序出错,有时是程序的需要。
相似回答