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语言中一些关于内存四区的归纳

    C语言中一些关于内存四区的归纳 博文参考传送门 一、综述 C语言程序中,代码是放在内存中执行的,我们大致将程序所占...

  • 关于C语言的指针和数组的差异

    标签(空格分隔): C语言 在C语言中有内存四区的概念,分别是常量区,代码区,堆区,栈区。在常量区中的内存数据是不...

  • C语言-内存四区

    内存总体被分为四大区域:堆区、栈区、全局区、代码区。每个区所存放的内容以及内容的声明周期不同。将内存进行区域划分有...

  • Objective-C 内存管理基础

    前言 之前的两篇拙文C语言-内存管理基础、C语言-内存管理深入 介绍了关于C语言在内存管理方面的相关知识。但是对于...

  • 学了指针没学动态内存一切都白搭!C语言基础教程之内存管理

    C语言内存管理 本文将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在头文件中...

  • C语言-内存管理深入

    前言 基础篇介绍了一些关于C语言内存管理的常见概念,包括内存编址、堆栈、内存操作函数、变量和数组存储简介等等。本文...

  • C提高

    1.选择排序 2.内存四区 3. typedef 首先://注意在C和C++里不同在C中定义一个结构体类型要用t...

  • 什么是堆栈,以及堆栈的区别

    首先,讨论的堆和栈指的是内存中的“堆区”和“栈区”,OC语言是C语言的超集,所以先了解C语言的内存模型的内存管理会...

  • iOS 堆和栈的区别

    首先,讨论的堆和栈指的是内存中的“堆区”和“栈区”,OC语言是C语言的超集,所以先了解C语言的内存模型的内存管理会...

  • c++ 内存四区

    代码区:存放函数体的二进制代码,由操作系统进行管理全局区:存放全局变量和静态变量,以及常量(字符串常量以及其他常量...

网友评论

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

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