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;