码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-14 19:16:56      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:   存储      全局区   静态变量   

堆:由程序员自己分配释放(用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",结构就像下图

技术分享

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

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

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

标签:   存储      全局区   静态变量   

原文地址:http://blog.csdn.net/fk5431/article/details/47663527

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!