IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 一、C语言基础篇——08. 内存管理 -> 正文阅读

[C++知识库]一、C语言基础篇——08. 内存管理

01. 作用域

局部变量:也是auto变量(auto可省略),定义在函数内部的变量

作用域:从定义开始,到包裹该变量的代码块结束

生命周期:从变量定义开始,到函数调用完成。——当前函数


全局变量:定义在函数外部的变量

作用域:从定义位置开始,默认到文件内部。其他文件如果想使用,可以通过extern关键字 声明全局变量 将作用域导出

生命周期:程序启动开始,到程序终止结束。——程序执行期间


static全局变量:在全局变量定义之前添加 static关键字

作用域:限制在本文件内部,不允许通过 extern关键字声明导出到其他文件

生命周期:程序启动开始,到程序终止结束。——程序执行期间


static局部变量:在局局变量定义之前添加 static关键字

特性:静态局部变量只定义一次,在全局内存中。通常用来做计数器

作用域:从定义开始,到包裹该变量的代码块结束

生命周期:程序启动开始,到程序终止结束。——程序执行期间


全局函数:类型 函数名(形参) + 函数体

作用域:整个程序

生命周期:程序启动开始,到程序终止结束。——程序执行期间


static函数:static 类型 函数名(形参) + 函数体

作用域:static函数只能在本文件内部使用。

生命周期:程序启动开始,到程序终止结束。——程序执行期间

#include <stdio.h>

int variate02;   //全局变量,不赋初值,默认为0
static int svar02;  //静态全局变量

void fun01()  //全局函数
{
    return;
}

static void fun02()  //静态函数
{
    return;
}

int main()
{
    auto int variate01 = 10;   //局部变量
    static int svar01;  //静态局部变量,不赋初值,默认为0
    
    return 0;
}

02. 内存布局

由于Windows操作系统不开放源码,所以不清楚Windows平台下的内存怎么分布

Linux系统开发源码。所以可以看到内部实际存储

内存4区模型:

  • 代码段:.text段。程序源代码(二进制形式)
  • 数据段:
    • 只读数据段 .rodata段,存放 常量
    • 初始化数据段 .data段,存放 初始化为非0的全局变量和静态变量
    • 未初始化数据段 .bss段,存放 未初始化的全局变量和静态变量,程序加载执行前,会将该段整体赋值为0
  • stack:栈。空间小,系统自动管理、自动分配、自动释放。 特性是FILO(先进后出)。 Windows下默认是1M,可提升上限至10M。Linux下默认是8M,可提升上限至16M
  • heap:堆。空间大,用户自己管理、分配、释放。特性是FIFO(先进先出)。约1.3G+

内存4区图如下(Linux版)
请添加图片描述

03. malloc()、free()

malloc()函数:堆区申请内存空间

#include <stdlib.h>
void *malloc(size_t size);
功能:在堆区内存中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。
参数:需要分配内存大小(单位:字节)
返回值:
	成功:分配空间的起始地址
	失败:NULL

free()函数:释放空间

#include <stdlib.h>
void free(void *ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。对同一内存空间多次释放会出错。
参数:需要释放空间的首地址,被释放区应是由malloc函数所分配的区域。
返回值:无

malloc()、free()的使用:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    //开辟堆空间
    int *p = (int*)malloc(sizeof(int)*10);
    if(p == NULL)
    {
        printf("malloc error\n");
        return -1;
    }
    
    //释放堆空间
    free(p);
    p = NULL;  //一般free完后,将该指针置为NULL
    
    return 0;
}

使用heap空间注意事项:

  1. free后,空间不会失效。通常free后,地址置为NUK=LL
  2. free地址必须是 malloc申请地址,否则free时会出错。(如:不要p++)
  3. 如果malloc之后的地址需要变化,那么可以使用临时变量temp保存原地址,然后free(temp);

04. 存储类型操作函数

memset()

分配的内存空间内容不确定,一般使用memset初始化。

#include <string.h>
void *memset(void *s, int c, size_t n);
功能:将s的内存区域的前n个字节以参数c填入
参数:
	参1:需要操作内存s的首地址
	参2:填充的字符,c虽然参数为int,但必须是unsigned char , 范围为0~255
	参3:指定需要设置的大小
返回值:s的首地址

memset()函数用法:

	int a[10];

	memset(a, 0, sizeof(a));
	memset(a, 97, sizeof(a));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%c\n", a[i]);
	}

memcpy()

#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
功能:拷贝src所指的内存内容的前n个字节到dest所值的内存地址上。
参数:
	参1:目的内存首地址
	参2:源内存首地址,注意:dest和src所指的内存空间不可重叠
	参3:需要拷贝的字节数
返回值:dest的首地址

memcpy()函数用法:

	int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int b[10];
	
	memcpy(b, a, sizeof(a));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d, ", b[i]);
	}

memmove()

memmove()功能用法和memcpy()一样,区别在于:dest和src所指的内存空间重叠时,memmove()仍然能处理,不过执行效率比memcpy()低些。

memcmp()

#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);
功能:比较s1和s2所指向内存区域的前n个字节
参数:
	参1:内存首地址1
	参2:内存首地址2
	参3:需比较的前n个字节
返回值:
	相等:=0
	大于:>0
	小于:<0

memcmp()函数用法:

	int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int b[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

	int flag = memcmp(a, b, sizeof(a));
	printf("flag = %d\n", flag);

05. 就近原则

#include <stdio.h>

int m = 100;
int main()
{
    int m = 10;
    printf("m = %d\n",m);   //10
    //不建议这样写
    
    return 0;
}

不建议自己这样写。只需要知道有这么个原理,别人这么写代码时看的懂,就够了。
of(a));
printf(“flag = %d\n”, flag);


# 05. 就近原则

```c
#include <stdio.h>

int m = 100;
int main()
{
    int m = 10;
    printf("m = %d\n",m);   //10
    //不建议这样写
    
    return 0;
}

不建议自己这样写。只需要知道有这么个原理,别人这么写代码时看的懂,就够了。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:45:50  更:2022-08-19 18:50:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:36:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码