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
- C++栈区的变量分配 与 内存读写越界问题引发的coredump问题
- 关于heap内存分配问题追踪以及对引发coredump原因的思考
- 由一个sizeof()引发的内存越界问题
- c中定义变量的内存分配顺序问题
- C的内存分配问题
- c的内存分配问题
- C的内存分配问题
- 越界访问内存的问题
- 关于内存越界的问题
- [java]String变量的内存分配问题
- c++中变量的内存分配问题
- 关于静态变量的内存分配问题
- C++中动态内存分配引发问题的解决方案
- C++中动态内存分配引发问题的解决方案
- C++中动态内存分配引发问题的解决方案
- C++中动态内存分配引发问题的解决方案
- C++中动态内存分配引发问题的解决方案
- C++中动态内存分配引发问题的解决方案
- Java几种简单的排序源代码
- learn python the hard way48
- 微信开发相关的功能
- mac 安装easy_install
- bat internet中局域网设置-代理
- C++栈区的变量分配 与 内存读写越界问题引发的coredump问题
- 基础总结篇之一:Activity生命周期
- C#中System.Timers.Timer的使用
- spring batch 3.0 scop job 问题记录
- VisualBasic使用CDO发送SSL加密邮件【我TM还是太年轻了】
- 设计模式(5):策略模式
- lucene学习--lucene基本概念和流程
- 51nod -1090 . 3个数和为0 && 1267 . 4个数和为0
- .Net线程的一些问题