浅谈c/c++与内存中的栈(stack)和堆(heap)区别,全局区等

1、栈区(stack)― 由编译器自动分配释放 ,存放函数局部变量,函数返回值等,没有特别标定的大部分函数内部变量,临时值等都存储在stack上,自动分配/回收。

2、堆区(heap) ― 一般由程序员分配释放, c++对应的是关键字new,c对应的是关键字malloc,也被称作动态分配内存,分配的区域就是在堆区。若程序员不释放,程序结束时可能由系统回收 。

一个程序的memory内存中往往栈的空间有限,所以有个词叫爆栈(overflow),而堆的空间往往比栈大,更灵活。

所以c++创建实例大致上可分为两类:在stack上创建和在heap上创建。

C++中内存分成5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

int a = 0; // 全局初始化区
char *p1;  // 全局未初始化区
void main()
{
  int b; //栈
  char s[] = "abc"; // 栈
  char *p2; // 栈
  char *p3 = "123456"; // 123456\0在常量区,p3在栈上。

  static int c =0// 全局(静态)初始化区

  p1 = new char[10];
  p2 = (char *)malloc(20); //  分配的10和20字节的区域就在堆区。

  strcpy(p1, "123456");    //123456\0放在常量区,编译器可能会将
                          // 它与p3所指向的"123456"优化成一个地方。
}  

参考博客

顺便提一个小tips,在oj算法题中大的数组比如int[1000005],在main函数里面定义基本都崩掉,写在main函数外面作为全局变量一般不会,而且有默认初始值,这个全局变量存储是在全局/静态存储区。

#include <iostream>
int a[100000005];//本人系统测试最高是这个数量级,全局区,可通过编译运行
int main(){
    std::cout<<"test Successfully"<<std::endl;
    return 0;
}

经过测试,个人电脑,全局区要是再大的数量级,会出现Error: value of 0000000xxxxxxx too large for field of 4 bytes at 0000000xxxxxxx 之类的错误。

发布了17 篇原创文章 · 获赞 15 · 访问量 1868

猜你喜欢

转载自blog.csdn.net/weixin_43723614/article/details/104972164