越界访问,就是很奇怪的,用不同的编译器,结果还不相同的,无法解释其行为。至于sizeof(arr)容易解释,因为作为函数参数的int arr[]会被编译器认为是int *arr,而32位机下任何指针都是4字节。

解决方案 »

  1.   

    谢谢您的回复。
    我把main()里面的size(a)换成sizeof(a)的话,它输出20。为什么输出会不同呢?
      

  2.   

    这个时候sizeof(a)是算数组a的长度
      

  3.   

    main()里面又不是函数参数,编译器把a当数组算,当然是20了。你要从编译器的角度去考虑sizeof的问题,sizeof实际上不是一个可以执行的函数,是让编译器来解释的,编译完成以后,原来sizeof的地方实际上已经被数字替换掉了。a是在main()里面定义的,所以编译器可以直接发现a的大小,并将之替换为20,但作为函数参数的话,我也可以调用size(b),而b可能是int b[10],所以编译器在编译阶段无法知道参数的确切大小,就不能将之替换为正确的数字,所以只能将其当指针处理,替换为4了