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

第39课 程序中的三国天下

时间:2016-04-04 01:20:00      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

1. 程序中的栈

1.1 栈的简介

(1)栈中现代计算机程序里最为重要的概念之一

(2)栈在程序中用于维护函数调用上下文

(3)函数中的参数局部变量存储在栈上

(4)栈保存了一个函数调用所需的维护信息

技术分享 

1.2 函数调用过程

(1)每次函数调用都对应着一个栈上的活动记录,调用函数的活动记录位于栈的中部被调用函数的活动记录位于栈的顶部

(2)函数调用栈的变化:以int main(){f();}→f(){}为例

 技术分享

技术分享技术分享

  1.3 函数调用栈上的数据

(1)函数调用时,对应的栈空间在函数返回前是专用的

(2)函数调用结束后,栈空间将被释放,数据不再有效

技术分享 

【编程实验】指向栈数据的指针

#include <stdio.h>

int* g()
{
    int a[10] = { 0 };
    
    return a; //返回栈中的数组
}

void f()
{
    int i = 0;
    int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    int* pointer = g();//pointer指向g函数栈中的数组

    /*
    //当g函数返回后,马上将栈中的数组保存到array中
    //但如果有其他函数的调用,则pointer所指向栈中的数组数据将是无效的!
    for (int i = 0; i < 10;i++)
    {
        array[i] = pointer[i];
    }

    for (i = 0; i < 10;i++){
        printf("array[%d] = %d\n", i, array[i]);
    }
    */
}

int main()
{
    f();

    return 0;
}

2. 程序中的堆

(1)堆是程序中一块预留的内存空间,可由程序自由使用

(2)堆中被程序申请使用的内存在被主动释放前将一直有效

(3)为什么有了栈还需要堆(栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如局部数组)

(4)C语言中通过库函数的调用获得堆空间:malloc和free

(5)系统对堆空间的管理方式(空闲链表法、位图法、对象池法等等)

技术分享 

3. 程序中的静态存储区

(1)静态存储区随着程序的运行而分配空间

(2)静态存储区的生命周期直到程序运行结束

(3)在程序的编译期静态存储区的大小就己经确定

(4)静态存储区主要用于保存全局变量静态局部变量

(5)静态存储区的信息最终会保存到可执行程序中

【编程实验】静态存储区的验证

#include <stdio.h>

int g_v = 1;     //静态区
static int g_vs; //静态区,只有本文件可见

void f()
{
    static int g_v1 = 3; //局部静态变量——静态区
    printf("g_v1 = %p\n", &g_v1);
}

int main()
{
    printf("g_v = %p\n", &g_v);     //g_v、g_vs、g_v1三者地址比较相邻
    printf("g_vs = %p\n", &g_vs);

    f();

    return 0;
}

4. 小结:三个基本数据区

(1)栈区主要用于函数调用的使用

(2)堆区主要用于内存的动态申请和归还

(3)静态存储区用于保存全局变量静态变量

 

 

第39课 程序中的三国天下

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5351233.html

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