C++栈区的变量分配 与 内存读写越界问题引发的coredump问题

来源:互联网 发布:域名对企业的意义 编辑:程序博客网 时间:2024/05/18 03:22


├———————┤低端内存区域
│ …… │
├———————┤
│ 动态数据区 │
├———————┤
│ …… │
├———————┤
│ 代码区 │
├———————┤
│ 静态数据区 │
├———————┤
│ …… │
├———————┤高端内存区域



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  2int 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;}


0 0