c语言逻辑中的数组地址溢出
让我们来看看这段代码
#include <stdio.h>
void main(){
int i;
int a[6];
for (i=0;i<8;i++){
a[i] = 0;
printf("new line\n");
}
}
这段代码将会被执行几次呢?
让我们看看结果吧:
显然,有好多好多次次
那么,为什么呢?
下表展示了我们代码中变量i申请的地址与数组a申请地址的关系:
0x0100 | 0x0104 | 0x0108 | 0x010c | 0x0110 | 0x0114 | 0x0118 | 0x011c |
---|---|---|---|---|---|---|---|
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | i |
我们必须要认识到在c语言中数组的本质,我们在调用数组的过程中实际上是在根据数组的首地址进行偏移。数组名提供了数组首地址,数组的类型提供了一次偏移的长度,数组的取值决定了需要偏移多少次。
因此,当我们在访问a[6]的时候,虽然这个地址在声明中并没有实际声明到,但由于数组调用是根据首地址的偏移量来确定的,所以编译器也会在0x0118这个地址放下一个0。
同样的,在a[7]调用时,修改的就是0x011c上的值,也就是变量i所对应的地址,因此变量i就重新修改为0了。
在这里同样涉及到声明顺序所产生的地址问题,让我们康康变量i与数组a之间的地址关系叭:
和上方表格所示内容类似,咱就不计算了,具体内容下次一定。