├———————┤低端内存区域
│ …… │
├———————┤
│ 动态数据区 │
├———————┤
│ …… │
├———————┤
│ 代码区 │
├———————┤
│ 静态数据区 │
├———————┤
│ …… │
├———————┤高端内存区域
2ff02670 2ff02670 char b[1]={0,};
2ff02674 2ff02678 int d[2]={1,};
2ff0267c 2ff0269b char c[32]="11";
2ff0269c 2ff2269b char a[1024*64*2]={0,};
2ff02670 2ff02673 char b[4]={0,};
2ff02674 2ff02678 int d[2]={1,};
2ff0267c 2ff0269b char c[32]="11";
2ff0269c 2ff2269b char a[1024*64*2]={0,};
1,编译器对变量在内存地址上的分配顺序与变量申请的顺序可能不同
2,对于占用一个字符的变量,编译器为了优化速度,其地址的分配会按照4字节进行对齐
3,申请变量或调用函数时,会不断的向低地址的内存空间进行申请.但是在使用申请好的变量数组时,是从高地址向低地址进行使用的.
4,对于内存越界读写问题引发core,无论是在递归N层的函数里调用还是在main函数中调用,只要写的时候不超过操作系统给其分配的内存空间,那么写的时候就不会core(会无视const变量),但是在函数回调时,被破坏的栈结构会产生core.
附调试代码:
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include<assert.h>
#define N 2
int f( )
{
//char a[1024*1024*64]={0,};
char b[1]={0,};
const char c[30]="11";
const int d[2]={1,};
//c[4]='4';
//d[1]=2;
//printf("%x %x\n",a,&a[1024*64*N-1]);
printf("%x %x\n",b,b);
printf("%x %x\n",c,&c[29]);
printf("%x %x\n",d,&d[1]);
int i;
for (i=0;i<10000;i+=1)
{
//if (i<67261087&&i>10)
//continue;
printf("%d %x \n",i,&b[i]);
//char cc=b[i];
b[i]=0;
}
return 0;
}
int g(int i)
{
if(i==0)
{
f();
return 0;
}
int a[100]={0};
g(i-1);
}
int main()
{
char a[1024*1024];
g(200);
return 0;
}