C零基础视频-45-内存的分区:全局区、栈区、堆

目录

  • 为什么程序的内存有分区
  • 程序运行时的内存分区
  • 堆内存

不久的将来,我们要开始学习在C中动态申请和释放内存。在学习它们之前,我们先学习程序内存的分区,为掌握和理解动态申请、释放内存做好基础铺垫。

为什么程序的内存有分区

一般而言,我们的住房会分成多个区域(卧室、厨房、阳台、卫生间等),不同区域有不同的功能。

运行时,程序分区的道理也是一样的,它方便操作系统管理程序,内存的不同区域,功能不同。

程序运行时的内存分区

作为初学者,我们简单认识下,程序有全局区栈区堆区即可。

  • 全局区:在main函数执行前就已经分配好,程序的代码(机器码)、全局变量都在全局区
  • 栈区:随着函数调用及返回,会被自动分配和回收。栈的空间大小比较有限(M级别)。

以下代码可以证明,栈的空间比较有限:

#include <stdio.h>

int main(int argc, char* argv[])
{
    char szBuff[10000000];
 return 0;
}

堆内存

不管了全局区还是栈区的内存,他们通常都只占可以使用的内存的一小部分,大量的内存被操作系统控制,按需动态分配。
这时,操作系统的角色类似于酒店,而内存就是房间。
我们动态申请内存的动作,类似于入驻酒店前订房;
我们动态释放内存的动作,类似于退房。
房间一直都存在那,我们能否使用,取决于酒店是否授权给我们(出租给我们)。
内存也类似,内存一直都存在,但是我们程序是否能够使用,使用哪块地址的内存,取决于操作系统如何分配给我们。

以上介绍的,被操作系统控制管理的动态分配、回收的内存区域,就称为

我们之后会学习,如何使用C标准库中的malloc与free函数,动态申请和释放堆中的内存。

原文地址:https://www.cnblogs.com/shellmad/p/11695694.html

时间: 2024-11-08 23:58:01

C零基础视频-45-内存的分区:全局区、栈区、堆的相关文章

C零基础视频-32-指针铺垫知识:计算机分级结构

目录 计算机的体系结构 什么是内存 指针 计算机的体系结构 冯诺依曼体系结构 哈佛体系结构 CPU是计算的核心,用于解析机器码和执行指令.CPU的数据处理能力非常快,但是(寄存器的)存储空间非常有限. 内存的数据传输速度适中(与CPU.硬盘比),存储空间适中: 硬盘数据传输速度慢,存储空间大. CPU可以(通过总线)直接操作内存,这样的能力体现在CPU指令上.实际上,计算机的绝大多数功能,都是通过CPU操作内存直接体现的. 其他的显示器.硬盘.打印机等是"外设". 因此,CPU如何定位

C零基础视频-47-C语言操作文件

目录 C语言文件操作函数 fopen:打开或创建文件 fopen中的mode参数 fclose:关闭文件 C语言文件操作函数 C标准库中提供了一系列的函数,来操作文件.因为C库函数做了这个中间层,屏蔽掉了操作系统上对于文件的不同处理. 关于文件的常见基本操作有: 打开文件:创建文件或打开文件载体(磁盘)中已有的文件 关闭文件:类似free,释放掉内存中与文件有关的动态资源 读取文件:数据由文件载体(磁盘)到内存 写入文件:数据由内存到文件载体(磁盘) fopen:打开或创建文件 fopen的原型

C零基础视频-46-malloc与free

目录 malloc的基本使用 free的基本使用 malloc配合sizeof使用 内存泄漏问题 malloc的基本使用 malloc的函数原型是: void *malloc( size_t size ); size:表示要申请的堆空间的大小,单位字节 返回值是一个void*类型的指针,malloc会将分配得到的空间的内存首地址返回 之所以采用void*类型指针,是因为malloc无法提前知道我们申请的空间用于怎样的类型.因此,通常我们需要将返回值进行指针强转. #include <stdlib

C零基础视频-38-函数指针与typedef

目录 函数指针的定义 函数指针的复杂性 typedef 函数指针的定义 函数在内存中也是有地址的: #include <stdio.h> void fun() { printf("hello, world\r\n"); } int main(int argc, char* argv[]) { printf("%p\r\n", fun); return 0; } 既然有地址,就可以定义指针存储改地址,存储函数(首)地址的指针,称为函数指针. 函数指针的定义

C零基础视频-48-文件的写入与读取

目录 fread与fwrite fread与fwrite 从信息的转换角度看,文件的读取与写入,其实就是信息在文件介质(磁盘)与内存之间进行转换. 文件读取(fread),就是将磁盘中的文件内容,读取进内存中:而文件写入(fwrite),就是将内存中的内容,写入到磁盘中. 那么他们就会面临几个关键问题: 数据在磁盘哪里? 数据在内存哪里? 有多少数据? 了解以上信息后,就不难理解fread与fwrite的函数原型: size_t fwrite( const void *buffer, size_

C零基础视频-42-共用体

目录 共用体的定义与使用 共用体与结构体的比较 共用体的定义与使用 共用体的关键字是union,共用体是非基本数据类型,同结构体类似,我们需要先声明共用体类型,再利用自定义的类型去定义变量. #include <stdio.h> #include <string.h> union MyUnion { double dbWeight; int nID; char szName[8]; }; int main(int argc, char* argv[]) { MyUnion unio

C零基础视频-33-指针的定义与使用

目录 指针的定义语法 指针指向变量地址 取变量的地址 变量地址赋值给指针变量 通过指针修改内存中的内容 指针的定义语法 指针变量中存放的是其他变量的地址,因此指针的类型,也与其要存放的地址类型有关. 有存放int型变量地址的指针,也有存放double型变量地址的指针. 具体而言,指针变量的声明语法是: 类型 * 指针变量名; 如: int *pIntValue = NULL; double *pDoubleValue = NULL; 以上分别定义了一个可以保存int变量地址以及可以保存doubl

C零基础视频-27-字符串

目录 什么是字符串 C语言中的字符串 字符数组与字符串的比较 什么是字符串 之前我们已经学过单个字符的文字型数据(char).同时了解过字符串. 在C语言中,字符串用双引号包围. #include <stdio.h> int main(int argc, char* argv[]) { printf("Hello"); return 0; } 字符串不是C语言中的基本数据类型.在我们之后的学习中可以看到,它是根据约定存储多个char数据的一种方式. C语言中的字符串 为了方

C零基础视频-41-使用结构体封装游戏角色

目录 关于游戏封装的思考 封装后代码 关于游戏封装的思考 原代码: #include <windows.h> #include <conio.h> #include <stdio.h> void MoveCursorTo(int nRow, int nCol) { COORD crdLocation; crdLocation.X = 2 * nCol; crdLocation.Y = nRow; SetConsoleCursorPosition(GetStdHandle