堆,栈,静态存储区的理解

堆:由程序员自己分配释放(用malloc和free,或new和delete) ,如果我们不手动释放,那就要到程序结束才释放。如果对分配的空间在不用的时候不释放而一味的分配,那么可能会引起内存泄漏,其容量取决于虚拟内存,较大。

#include<iostream>
#include<cstdio>
#include<windows.h>
#include<cstdlib>
#include<cstring>
using namespace std;
char * getMen(int num)
{
    char *p1 = NULL;
    p1 = (char *)malloc(sizeof(char) * num);
    if(p1 == NULL)
        return NULL;
    return p1;
}
int main()
{
    char *tmp = NULL;
    tmp = getMen(10);
    if(tmp == NULL)
        return 0;
    strcpy(tmp, "111222");
    printf("%s\n\n", tmp);

    system("pause");
    return 0;
}

上面的程序会输出“111222”, 由此可见,在堆上分配的内存空间,如果我们不手动回收,即使函数结束被析构,我们仍然可以使用在函数中分配的空间。

栈:由编译器自动分配释放,其中存放在主调函数中被调函数的下一句代码、函数参数和局部变量,容量有限,较小。

#include<iostream>
#include<cstdio>
#include<windows.h>
#include<cstdlib>
#include<cstring>
using namespace std;
char * getMen(int num)
{
    char *p1 = NULL;
    p1 = (char *)malloc(sizeof(char) * num);
    if(p1 == NULL)
        return NULL;
    return p1;
}
char *getMen2()
{
    char buf[64];  //临时变量 栈区存放
    strcpy(buf, "123456789");
    printf("buf:%s", buf);
    return buf;
}
//栈区函数结束被析构
int main()
{
    char *tmp = NULL;
    tmp = getMen(10);
    if(tmp == NULL)
        return 0;
    strcpy(tmp, "111222");

    tmp = getMen2();
    printf("tmp:%s\n\n", tmp);

    system("pause");
    return 0;
}

而在函数getMen2中,定义数组被分配到栈区,当这个函数结束被析构之后,栈区的数组也被释放,而且return不是吧内存块中的64个字节返回,而是吧内存块的首地址返回,因此,最后输出的tmp是一个不确定的因素。

通过代码可以知道,堆和栈的增长模式正好是相反的,堆的增长模式是向上的由低地址向高地址增长,而栈是有高地址向低地址增长。这样每个函数都有一个栈,从高地址向低地址增长就可以避免栈的溢出。

静态存储区:由在编译时由编译器分配,由系统释放,其中存放的是全局变量、static变量和常量.

#include<cstdio>
#include<iostream>
#include<windows.h>
using namespace std;
char * getStr1()
{
    char *p1 = "abcdefg2";
    return p1;
}
char * getStr2()
{
    char *p2 = "abcdefg2";
    return p2;
}
int main()
{
    char *p1 = NULL;
    char *p2 = NULL;

    printf("p1:%d, p2:%d \n", p1, p2);

    p1 = getStr1();
    p2 = getStr2();

    //打印p1 p2 所指向内存空间的数据
    printf("p1:%s, p2:%s \n", p1, p2);
    //p1 p2 的数据
    printf("p1:%d, p2:%d \n", p1, p2);

    system("pause");

    return 0;
}

在全局区定义的"abcdefg2",结构就像下图

而在全局区定义的变量,如果是一个变量,系统不会分出两个空间来存储两个相同的,只会让指针指向这一个全局区的数据的位置

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 06:54:16

堆,栈,静态存储区的理解的相关文章

栈,堆,静态存储区

1.栈是先入后出, 2.栈保存了一个函数调用所需的维护信息,函数参数,函数返回地址,局部变量,函数调用上下文.没有栈就没有函数,没有局部变量. 3. 栈保存了一个函数调用所需的维护信息(函数参数,函数返回值地址,局部变量,函数调用上下文) 4.栈上的数据在函数返回后就会被释放掉,无法传递到函数外部 5.堆是程序中一块巨大的内存空间,可由程序自由使用 6.堆中被程序申请使用的内存在程序主动释放前将一直有效 7.堆空间通过申请才能获得 8.系统对堆空间的管理方式(空闲链表法,位图法,对象池法等等)

C++局部变量、全局变量、静态变量(堆、栈、静态存储区)

1 static关键字 1.1 隐藏 eg: //a.c文件中 char a = 'A'; void msg() { printf("Hello\n"); } //main.c文件中 extern char a; printf("%c",a); 输出结果:A Hello 所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问.a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的. 如果加了stat

ios笔记-静态存储区、堆、栈

1.概念解释 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存.动态内存的生存期可以由我们决定,如果我们不释放内存

(转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

程序在内存有五个存在区域: A:动态区域中的栈区  B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量    (这个区域又可以进一步细分为:初始化的全局变量和静态变量    以及    未初始化的全局变量和静态变量  ) D:静态区域中:文字 数字 常量 E:静态区域中:代码区(就是编译后的二进制代码  指导CPU怎么运行的玩意) ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 栈,程

c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区

在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收. 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的.

(转)C++堆、栈、自由存储区、全局/静态存储区和常量存储区

一.一个由c/C++编译的程序占用的内存分为以下几个部分:    1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.    2.堆区(heap) — 一般由程序员分配释放(malloc/free, new/delete),若程序员不释放,程序结束后可能由操作系统回收.注意它与数据结构中的堆石两回事,分配方式倒是类似与链表.其中有malloc/free分配释放的也可以叫自由存储区.   3.全局区(静态存储区)(static)— 全

C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

      栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样,用户栈在程序执行期间可以动态地扩展和收缩. 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收.堆可以动态地扩展和收缩. 自由存储区,就是那些由 

(转载)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

C++内存分配方式详解--堆.栈.自由存储区.全局/静态存储区和常量存储区       栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样,用户栈在程序执行期间可以动态地扩展和收缩. 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete.如果程序员没有释放掉,那么在程序结

堆区、栈区和静态存储区详解

一.内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程