栈和堆,stack和heap,以及程序的内存分配

5 篇文章 0 订阅

stack,栈,准确来说,应该叫“堆栈”。

heap,堆。


程序运行时占用的内存分为如下5个区:

stack,栈,这玩意儿是系统分配的,大小有限,一般windows上默认给程序分配的是1M,所以你会看到stack overflow这种报错。这货一般保存局部变量和函数参数。

heap,堆,这玩意儿是你自己申请和释放的,你不释放那就只能等程序跑完,系统帮你回收了,搞不好就泄漏了。你用什么new、delete、malloc、free啊什么的,操作的那片内存,就是heap。

static,静态区,一般是来放全局变量和static变量(包括static全局变量和static局部变量)。 初始化后的放在一块,没有初始化的放在旁边一块。

文字常量区,常量字符串就存在这里,程序完了后系统自动释放。

代码区,函数的二进制代码。


不过,看到也有资料说,程序运行时占用的内存分为如下五个区:

代码区、初始化数据区、未初始化数据区、堆区、栈区。


我个人感觉上面两种说法应该说的都差不多。因为我们的stack和heap,栈和堆用好了,程序就问题不大了。


在别处看到一个例子,关于程序内存分配的,感觉很有道理。摘录下来,大家看一下:

int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
  int b; //栈
  char s[] = "abc";// 栈
  char *p2; //栈
  char *p3 = "123456"; //123456在常量区,p3在栈上。
  static int c =0; //全局(静态)初始化区
  p1 = (char *)malloc(10);
  p2 = (char *)malloc(20);
  //分配得来得10和20字节的区域就在堆区。
  strcpy(p1, "123456"); //123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
} 

不过这货好像malloc后没有free啊,哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值