一,代码:
#include <stdio.h>
int main(int argc, char* argv[])
{
int i = 0;
int arr[3] = {0};
for(; i <= 3; i++)
{
arr[i] = 0;
printf("hello world\n");
}
return 0;
}
这段程序的运行结果,在某些机器上,并非是打印四行"hello word",而是会无限循环打印"hello world".
二,内存分配问题
在内存分配时,会按照内存地址递增或者递减的方式进行分配
三,Linux内存布局
函数体内的局部变量存在栈上,且是连续压栈。下图是Linux进程的内存布局图;栈区在高地址空间,地址从高地址向低地址增长。
三,代码解析
从前面知道,变量i跟arr在相邻的地址上,且i的地址比arr的地址大(低地址数值大),从内存布局上,i在arr的下面;所以,arr地址分配是由上往下分配,数组arr越界刚好访问到i;即arr[3] = 0;想到于i= 0;导致无限循环。
四,代码验证
#include <stdio.h>
int main(int argc, char* argv[]){
int i = 0;
int arr[3] = {0};
for(; i <= 3; i++){
printf("变量i 的地址为:%p\n", &i);
printf("m[0] 的地址为:%p\n", &arr[0]);
printf("m[1] 的地址为:%p\n", &arr[1]);
printf("m[2] 的地址为:%p\n", &arr[2]);
printf("m[3] 的地址为:%p\n", &arr[3]);
arr[i] = 0;
printf("hello world\n");
}
return 0;
}
gcc -fno-stack-protector main.c -o test
变量i 的地址为:0x7ffde08ed5ec
m[0] 的地址为:0x7ffde08ed5e0
m[1] 的地址为:0x7ffde08ed5e4
m[2] 的地址为:0x7ffde08ed5e8
m[3] 的地址为:0x7ffde08ed5ec