C语言中一些关于内存四区的归纳

作者: 没想好昵称呵 | 来源:发表于2017-09-23 15:46 被阅读198次

    C语言中一些关于内存四区的归纳

    博文参考传送门

    一、综述

    C语言程序中,代码是放在内存中执行的,我们大致将程序所占用的内存分为四个区域:

    • 栈区 堆区 数据区 代码区

    每个程序都有唯一一个内存四区,我们应该掌握各个区域的特性,例如存储哪种类型的数据,由谁去申请开辟,又由谁去管理释放等等。

    二、内存四区介绍

    1. 栈区

    由编译器自动分配释放,比如存放函数的参数值,局部变量等。
    例如:

    void recive(int a,int b) {
        int c;
    }
    

    其中,参数a,参数b和变量c都是存放在栈区,当函数执行完毕的时候,它们占有的空间自动释放。

    2. 堆区

    一般由程序员分配释放(如动态内存申请<malloc函数>),若程序员不释放,程序结束时可能由操作系统回收。
    例如:

    char *src;
    src = (char*)malloc(4 *sizeof(char));//动态分配内存,表示查找可用的连续4个字节内存的空间,并将该内存首地址强制转换为指向字符数据的指针赋给scr,为src这个指针变量分配4个char类型的空间。
    
    3.数据区

    分为两种:1、常量区:存放常量,一般是字符串常量。
    2、全局区(静态区):存放全局变量和静态变量。
    该区域是在程序结束后由操作系统释放。

    4.程序代码区

    这个区域存放函数体的二进制代码,也是由操作系统进行管理。

    三、划分内存四区的意义

    C语言程序中,根据是局部变量,全局变量,常量还是其他,通过malloc等类似的函数分配内存空间,把他们放到对应的内存区中,这样就赋予了这些变量或常量不同的生命周期。
    根据我们程序的需要,我们在编写代码过程中,声明不同的变量类型,使他们有不同的声明长度,不同的释放方式,可以让我们更加灵活地编程。

    四、内存四区的一个实例

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i;
        char* p1[3]= {"abc","def","ghi"};
        char p2[3][4]= {"123","456","789"};
        char** p3= (char**)malloc( 3 * sizeof(char*));
        for(i=0;i < 3;i++)
        {
            p3[i]= (char *)malloc ( 5 * sizeof(char));
            sprintf(p3[i],"%d%d%d",i,i,i);  
            /*
            sprintf()函数:最常见的应用之一是把整数打印到字符串中
            例如:
            srpintf(s,"%d",123);
            输出为:"123"
            输出结果不会打印在屏幕上,而是写入字符串中
            */
            printf("%s\n",p3[i]);
            /*
            printf()函数才将结果输出到屏幕上
            */
        }
        free(p3);
        return 0;
    }
    

    示例代码图示:

    示例代码图示

    相关文章

      网友评论

        本文标题:C语言中一些关于内存四区的归纳

        本文链接:https://www.haomeiwen.com/subject/wdpcextx.html