关于数组越界问题简析

2019-07-13 07:36发布

code1:

#include #include void f(){} int main() { int i=10; //char*p=(char*)&i; //int *pp=&i; char str[9]; scanf("%s",str); printf(" i=%d ",i); printf("main:%0xp str:%0xp f: %0xp",main,str,f); system("pause"); return 0; }

code1 end 1.input:dwadwada  ->输入12个字符以内,正确执行
2.input:dwadwadwadsdl ->输入超过12个字符  变量i被覆盖 分析:
因为计算机对内存的读写存在补位的规则:(普遍以4个字节为单位)
笔者定义了数组: char[9]:占9个字节,根据规则分配12个字节
临时变量在栈上存在(栈逆向生长)
故变量i和char[9]在逻辑内存上的分布情况如下:

C语言数组没有边界检查,c++可通过重载[]实现 但是在数组的初始化时c语言不支持越界操作:char s[5]="hhhhhhh";   ->error 另外:如果在变量i和str键定义指针变量则会增减不确定性
for instance:有循环变量引起的经典越界: #include int main() { int i; int arr[10]; for(i=0;i<=10;i++) { arr[i]=1; } return 0;