内存分配方式与变量的生存周期

原创 2011年01月07日 17:32:00

 

先上一段测试程序:

char *aa() {
    char *p = malloc(10);    //动态分配,"hello"存于"堆"(heap)
    p[0] = 'h';
    p[1] = 'e';
    p[2] = 'l';
    p[3] = 'l';
    p[4] = 'o';
    p[5] = '\0';
    printf("sub aa pointer: %p\n", p);
    printf("sub aa content: %s\n", p);
    return p;
}

char *bb() {
    char p[] = "hello";    //自动分配,"hello"存于栈(stack)
    printf("sub bb pointer: %p\n", p);
    printf("sub bb content: %s\n", p);
    return p;   //warning,bb()函数完后,p所指区域被释放
}

char *cc() {
    char *p = "hello";   //"hello"存于常量区(static)
    printf("sub cc pointer: %p\n", p);
    printf("sub cc content: %s\n", p);
    return p;
}

int main()
{
    char *raa = aa();
    printf("main aa pointer: %p\n", raa);
    printf("main aa content: %s\n\n", raa);

    char *rbb = bb();
    printf("main bb pointer: %p\n", rbb);
    printf("main bb content: %s\n\n", rbb);

    char *rcc = cc();
    printf("main cc pointer: %p\n", rcc);
    printf("main cc content: %s\n\n", rcc);
    free(rbb);
    return 0;
}


程序解析:

1.   aa()中,虽然p是局部变量,存储在栈中,但它指向的是堆内存,函数跳出后堆内存不会自动被释放,所以main()函数中可以接收的到。

2.   bb()中,p是一个数组,一个局部变量,属于自动分配。函数在跳出后,返回的是p的内容(数组的地址),但数组本身已经被释放了,所以在主函数中接收不到p数组的内容。

3.   cc()中,虽然p是局部变量,存储在栈中,但它指向的“hello”是常量,属于静态分配,存储在静态存储区,函数跳出时常量也不会被释放,释放的只是p变量,它存的只是“hello”的地址,但它已经返回给main()函数接收了,它释放了没关系,所以main()函数同样可以接收“hello”。

 

内存分配方式有三种:静态分配、动态分配、自动分配。

1.静态分配:编译时完成的;保存在静态存储区,程序结束时才被释放,例如全局变量,static变量,代码,常量等(代码、常量可以单独归类)。

2.动态分配:程序在运行的时候用mallocnew申请的任意多少的内存,程序员自己负责在何时用freedelete释放内存;保存在堆里(不是数据结构的堆)

3.自动分配:函数执行时由系统自动创建,函数结束时自动被释放;保存在栈里,例如函数的局部变量。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

 

堆的解释:系统把连续空闲的堆内存看成一个个的块,再用指针链表把所有的块串起来,需要分配时遍历链表,找出一个足够大小的块进行分配,剩下的把它放到链表中;用完释放时,系统再把它放回链表中。

PS:有趣的比喻:可以把堆内存看成一个沙堆(我忘了在哪本书上看到的了),需要时,用铲子在沙堆里铲出一些沙,用完时,在把它放回到沙堆里,所以,两次取沙子不太可能会取到同样的。

 

 ……

 

待续……  ^_^


……

 

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

C++中变量的生存周期

在C++中变量有以下两种生存周期:       #变量由编译程序在编译时给其分配存储空间(称为静态存储分配),并在程序执行过程中始终存在。这类变量的生存周期与程序的运行周期相同,当程序运行时,该变量...
  • darkxiaoming
  • darkxiaoming
  • 2017年04月18日 20:57
  • 541

C语言变量生存周期

C语言变量在整个程序中的生命周期
  • essity
  • essity
  • 2015年12月16日 18:17
  • 2085

内存分配方式以及它们的区别

 从静态存储区域分配内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。 在栈上创建在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行...
  • xjtuse_mal
  • xjtuse_mal
  • 2006年09月02日 15:29
  • 2073

内存分配方式有几种?

内存分配方式有几种? 静态存储区 栈 堆 的内存分配 1,从静态存储区域分配内存。程序编译的时候内存已经分配好了,并且在程序的整个运行期间都存在,例如全局变量。 2,在栈上创建。在执行函数时,函...
  • cddchina
  • cddchina
  • 2013年10月12日 09:11
  • 9983

内存分配的三种方式

内存分配有三种方式: 一:从全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。 二:从栈区分配:在执行函数的时候,函数中的...
  • chaoshui7758
  • chaoshui7758
  • 2015年09月03日 14:22
  • 2796

结构体内数据变量内存分配详解

原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字...
  • ZHM977863924
  • ZHM977863924
  • 2015年03月12日 09:31
  • 1520

关于linux的export命令和shell变量的生命周期

http://www.cppblog.com/mydriverc/archive/2009/09/16/96476.html export:将自定义变量设定为系统环境变量(当前shell中有效) ...
  • xufenghfut
  • xufenghfut
  • 2012年11月26日 12:29
  • 1900

2、C语言中变量的存储,生存周期,作用范围分类

C语言中变量的存储类别 一:按作用域划分 1、局部变量:自动局部变量、静态局部变量、寄存器变量。(局部可见性) 2、全局变量:静态外部变量、外部变量。(全局可见性) 二:按生存周期划分 1、...
  • xuxianmei
  • xuxianmei
  • 2013年06月06日 18:02
  • 1075

Linux下的内存分配方式简述

1.内存的最小单位为页(4KB),在此基础上使用“伙伴系统算法”协助管理不同连续长度的内存段,将1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块分类管理。 2.在...
  • o0Avalon0o
  • o0Avalon0o
  • 2017年02月16日 18:09
  • 190

变量的生命周期和{ }的相关知识

生命周期如果和寄存器、内存什么的挂钩,就变得不那么好理解。、 其实生命周期的概念也很简单,无非就是变量从哪到哪有效。这里只说生民周期和大括号{ }的联系 浅显一点说,一个变量的生命周期就是从上一个...
  • u011497904
  • u011497904
  • 2015年01月16日 11:09
  • 1070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存分配方式与变量的生存周期
举报原因:
原因补充:

(最多只允许输入30个字)