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语言动态内存管理 -> 正文阅读

[C++知识库]C语言动态内存管理

1.首先我们要知道为什么要动态内存管理:

a.我们平时申请的内存空间大多是以数组形式申请的,所以它的大小都是固定的(就是数组的长度).它所给的长度在编译时就已经确定,之后无法更改.

b.当我们输入的数据把数组填满时,就无法再输入数据了,如果再输入就会发生内存越界,系统就会崩溃.因此我们就必须使用动态内存管理了,这样我们在数据填满空间之后,就可以再次按自己的需要扩大空间了.

2.知道以上两点我们就知道了动态内存管理的重要性了,因此接着介绍四个动态内存管理的相关函数了.(malloc,free,calloc,realloc).

a. void* malloc (size_t size);

(1).这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

(2).然后看函数参数类型,(size)大小,内存块的大小,以字节为单位。(size_t)是无符号整数类型。因此我们申请空间的时候参数填的是所申请空间的大小(字节数).

下面举个实例来说明上面两点:

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

int main() {
    int* a = (int*)malloc(sizeof(int) * 5);
    //先定义一个int*类型的指针变量指向我们要申请空间的首部,因为malloc的返回值是void*没有类型的
    //所以我们把它转成(int*)类型,然后就是参数了,首先是sizeof(int)一个int类型的字节大小,然后乘
    //5,总共就是4*5=20个字节了.
    if (a == NULL) {//判断是否成功
        printf("申请失败!");
    }

    for (int i = 0; i < 5; i++) {//给我们申请的空间赋值
        *(a + i) = i;
    }

    for (int i = 0; i < 5; i++) {//打印空间中的内容
        printf("%d ", *(a + i));
    }

    free(a);//空间使用完之后一定记着释放
    return 0;
}

看运行结果:

内容成功打印.

b. void* calloc (size_t num, size_t size);

(1).函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

(2).同上我们看看函数参数类型,size代表字节数,num代表申请多少个大小为size的空间.(所申请的空间大小依然为字节数)

(3).因为这个函数与malloc的功能大抵相同所以我们在这里就不举例说明了.平时我们几乎也不会用到这个函数来申请空间.

c. void free (void* ptr);

(1).在上面我们已经使用过这个函数了,需要记住的是free是配合malloc.calloc.realloc三个共同使用,每当我们所申请的空间使用完之后都需要使用free释放空间(对于一个完整的系统来说根据需要进行释放).

(2).其中的参数是所申请的空间的首地址,也就是存放空间首地址的指针:free(ptr),需要注意的是释放之后的指针就成了一个野指针了,再也不可以使用了.

(3).不可以重复释放

(4).如果不释放,就可能会造成内存泄漏

d. void* realloc (void* ptr, size_t size);

(1).ptr 是要调整的内存地址 ,size 调整之后新大小 返回值为调整之后的内存起始位置。 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。 realloc在调整内存空间的是存在两种情况: 情况1:原有空间之后有足够大的空间,情况2:原有空间之后没有足够大的空间.

(2).总的来说就是,先输入所要改变的空间的指针:ptr,然后在输入改变之后的大小,最后它的返回值是一个地址,这个地址就是改变之后空间的首地址.

下面举个实例来说明上面两点:

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

int main() {
    int* a = (int*)malloc(sizeof(int) * 5);
    //先定义一个int*类型的指针变量指向我们要申请空间的首部,因为malloc的返回值是void*没有类型的
    //所以我们把它转成(int*)类型,然后就是参数了,首先是sizeof(int)一个int类型的字节大小,然后乘
    //5,总共就是4*5=20个字节了.
    if (a == NULL) {//判断是否成功
        printf("申请失败!");
    }

    for (int i = 0; i < 5; i++) {//给我们申请的空间赋值
        *(a + i) = i;
    }

    for (int i = 0; i < 5; i++) {//打印空间中的内容
        printf("%d ", *(a + i));
    }

    printf("\n");
    a = realloc(a, sizeof(int) * 10);//使用realloc函数来对该空间进行扩容

    for (int i = 0; i < 10; i++) {//给我们扩容后的空间赋值
        *(a + i) = i;
    }

    for (int i = 0; i < 10; i++) {//打印扩容后空间中的内容
        printf("%d ", *(a + i));
    }

    free(a);//空间使用完之后一定记者释放
    return 0;
}

看运行结果

?申请之后的空间成功打印.

e.柔性数组(现在我们几乎已经不使用了在这不做过多介绍).

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:12:56  更:2021-11-10 12:15:59 
 
开发: 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/24 5:50:21-

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