查看: 1625|回复: 1
打印 上一主题 下一主题

内存的堆和栈

[复制链接]
跳转到指定楼层
沙发
发表于 2018-4-9 10:12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       内存的栈
       栈有栈底(高地址)和栈顶(低地址),栈底的指针式不变的指向栈的初始地址,栈顶指针一开始也是指向栈底的,当有数据进来的时候,栈顶的指针就加一指向栈的下一个地址,当要读取当前栈的数值时,栈顶的指针就减一,栈是讲究先进后出的原则的,当要读取前面的栈的数据时必须要把要读取栈的数据的后面的栈的数据都读取走,当栈的指针一直减知道指向你需要读取的地址。
       队列就是和栈相反的,讲究先进先出的原则。
       局部变量就是在栈当中定义的,当我们在函数当中定义了一个局部变量,这个变量就会存在栈当中,就是入栈,当我们退出函数的时候,局部变量就会销毁也就是出栈,栈是反复使用的,当我们要读取栈的值的时候,实际上是将栈的值复制了一份,然后栈顶指针减一指向前一个地址,但是之前栈里的数还是保留的,所以当我们定义了一个局部变量的最好做初始化,否者可能定义的变量是一个随机的数值。
       栈是固定大小的,所以在定义局部变量的时候不要太大了,要在栈的大小范围内,防止栈溢出,栈溢出就会出现不可控的问题。
       内存的堆
       堆内存是操作系统划给堆管理器的,属于操作系统的内存管理单元,当我们需要比较大且反复使用的内存的时候,使用对内存会比较方便,堆内存的申请和释放都是需要程序员手动申请的,一般申请内存函数在<stdlib.h>里面定义,一般有:
void *malloc(size_tsize);//申请任意字节大小的内存。
void *calloc(size_tnmemb,size_t size);//申请多个相同类型的内存。
void *realloc(void*ptr,size_t size);//改变已申请内存块的大小。
如:
malloc(40)可以写成malloc(10*sizeof(int))就是申请10x4个字节大小的内存块(一个int有4个字节)。
calloc(10,4)可以写成calloc(10,sizeof(int))和上面的函数是一样的也是申请10x4个字节。
内存释放则用free就可以了 voidfree(void *ptr);
注意申请后一定要释放否则就会出现bug,造成内存泄露,程序无法在申请到内存后就崩溃了。

回复

使用道具 举报

板凳
发表于 2018-4-12 22:05:02 | 只看该作者
感谢大佬分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表