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


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



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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值