学习网址:https://www.nowcoder.com/study/live/528/1/1
第一个问题:数组下标越界
数组下标越界
没有规定说声明的数组要挨着放,也就是图中的abc三个数组是没有规定地址是连在一起的,一般来说编译器是会这么干的,而且每个编译器的都会在之间留点空(也就是0)每个编译器所留的空还不一样。
这里看到上面的两个运行结果输出不一样的内容(相反),是因为
int a[10],b[10];
想访问b[-10]来达到访问a[9]的效果
因为上面说了编译器一般会把定义的数组地址连在一起,所以这样子定义看起来没问题
但是在上图中显示的运行结果说明:
第二个代码定义的数组是从c数组开始到a数组结束
第一个代码定义的数组是从a数组开始到c数组结束
像这种情况就要先去看数组还能正常运行吗(数组还活着吗)
上面的代码中的一个逻辑就是
因为定义数组一般都是连续的
所以如果数组下标越界了,
就比如在赋值b数组的值的时候,越界了,a数组就b数组的后面,那么数值就会继续赋值给a数组里面的元素
反之,c在b数组的后面的话就会赋值给c数组里面的值
第二个问题:函数的传参顺序
上面的图中,左边的代码执行结果为2,3;右边的图结果为3, 3
右边的是先将b=b+1执行了之后,再将b值传进去。
不同的操作系统方式是不一样的,不同的编译器也是不一样的
Linux系统下,会先传左边的。