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.malloc()函数,free()函数,calloc()函数,realloc()函数

1.1 malloc()函数

【原型】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#a31515">void</span> *<span style="color:#a31515">malloc</span>(<span style="color:#a31515">size_t</span> size);
<span style="color:#008000">// 参数表示动态内存分配空间的大小,以字节为单位。</span>
<span style="color:#008000">// size_t 是typedef重定义的类型,xxx_t的类型,通常都是整型相关数据类型的重定义。</span>
</code></span>

【作用】:用来进行内存分配。如果分配成功则返回被分配内存的指针(初始值不确定),否则返回空指针NULL。是在堆上进操作的。

<span style="color:#4b4b4b"><code class="language-cpp">用来进行内存分配。如果分配成功则返回被分配内存的指针(初始值不确定),否则返回空指针<span style="color:#a31515">NULL</span>。是在堆上进操作的。
</code></span>

【头文件】:malloc.h或stdlib.h

<span style="color:#4b4b4b"><code class="language-c"> <span style="color:#0000ff">malloc</span>.h或stdlib.h
</code></span>

【实例】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#a31515">int</span> *n;
<span style="color:#008000">// n = malloc(sizeof(int));// 错误,返回void*类型,需要转换</span>
n = (<span style="color:#a31515">int</span> *)<span style="color:#0000ff">malloc</span>(<span style="color:#0000ff">sizeof</span>(<span style="color:#a31515">int</span>));
</code></span>

1.2 free()函数

【原型】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#a31515">void</span>  <span style="color:#a31515">free</span>(<span style="color:#a31515">void</span> *ptr);
</code></span>

【作用】:不再使用malloc申请的空间后,应使用free释放掉该内存空间

<span style="color:#4b4b4b"><code class="language-sql">不再使用malloc申请的空间后,应使用<span style="color:#0000ff">free</span>释放掉该内存空间
</code></span>

1.3 calloc()函数

【原型】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#a31515">void</span> *<span style="color:#a31515">calloc</span>(<span style="color:#a31515">size_t</span> n, <span style="color:#a31515">size_t</span> size);
</code></span>

【作用】:在内存的动态存储区中分配n个长度为size的连续空间,成功返回一个指向分配起始地址的指针,失败返回空指针NULL

<span style="color:#4b4b4b"><code class="language-cpp">在内存的动态存储区中分配n个长度为size的连续空间,成功返回一个指向分配起始地址的指针,失败返回空指针<span style="color:#a31515">NULL</span>
</code></span>

【跟malloc的区别】:calloc在动态分配完内存后,自动初始化内存空间为0。malloc不初始化,里面数据是随机的垃圾数据。

<span style="color:#4b4b4b"><code class="language-undefined">calloc在动态分配完内存后,自动初始化内存空间为0。malloc不初始化,里面数据是随机的垃圾数据。
</code></span>

1.4 realloc()函数

【原型】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#a31515">void</span>* <span style="color:#a31515">realloc</span> (<span style="color:#a31515">void</span>* ptr, <span style="color:#a31515">size_t</span> size);

<span style="color:#008000">// 参数</span>
ptr -- 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 <span style="color:#0000ff">malloc</span>、<span style="color:#0000ff">calloc</span> 或 <span style="color:#0000ff">realloc</span> 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。
size -- 内存块的新的大小,以字节为单位。如果大小为<span style="color:#880000">0</span>,且ptr指向一个已存在的内存块,则ptr所指向的内存块会被释放,并返回一个空指针。
</code></span>

【作用】:重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。

<span style="color:#4b4b4b"><code class="language-x86asm">重新调整之前调用 malloc 或 calloc 所分配的 <span style="color:#0000ff">ptr</span> 所指向的内存块的大小。
</code></span>

【实例】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#2b91af">#<span style="color:#0000ff">include</span> <span style="color:#3388aa"><stdio.h></span></span>
<span style="color:#2b91af">#<span style="color:#0000ff">include</span> <span style="color:#3388aa"><stdlib.h></span></span>
<span style="color:#2b91af">#<span style="color:#0000ff">include</span> <span style="color:#3388aa"><string.h></span></span>

<span style="color:#a31515">int</span> <span style="color:#a31515">main</span>()
{
    <span style="color:#a31515">char</span> *str;

    <span style="color:#008000">/* 最初的内存分配 */</span>
    str = (<span style="color:#a31515">char</span> *) <span style="color:#0000ff">malloc</span>(<span style="color:#880000">15</span>);
    <span style="color:#0000ff">strcpy</span>(str, <span style="color:#a31515">"runoob"</span>);
    <span style="color:#0000ff">printf</span>(<span style="color:#a31515">"String = %s,  Address = %p\n"</span>, str, str);
 
    <span style="color:#008000">/* 重新分配内存 */</span>
    str = (<span style="color:#a31515">char</span> *) <span style="color:#0000ff">realloc</span>(str, <span style="color:#880000">25</span>);
    <span style="color:#0000ff">strcat</span>(str, <span style="color:#a31515">".com"</span>);
    <span style="color:#0000ff">printf</span>(<span style="color:#a31515">"String = %s,  Address = %p\n"</span>, str, str);

    <span style="color:#0000ff">free</span>(str);

    <span style="color:#0000ff">return</span>(<span style="color:#880000">0</span>);
}

<span style="color:#008000">// 结果</span>
<span style="color:#008000">// String = runoob,  Address = 0x7f801cd00000</span>
<span style="color:#008000">// String = runoob.com,  Address = 0x7f801cd00000</span>
</code></span>

2.memcpy()函数,memmove()函数,memset()函数

2.1 memcpy()函数

【原型】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#a31515">void</span> *<span style="color:#a31515">memcpy</span>(<span style="color:#a31515">void</span> *dst, <span style="color:#a31515">void</span> <span style="color:#a31515">const</span> *src, <span style="color:#a31515">size_t</span> length);
</code></span>

【作用】:从src的起始位置复制length个字节到dst的内存起始位置。memcpy()函数不关心被复制的数据类型,只是逐字节的进行复制,这样可以面向任何数据类型进行复制。

<span style="color:#4b4b4b"><code class="language-scss">从<span style="color:#a31515">src</span>的起始位置复制length个字节到dst的内存起始位置。<span style="color:#0000ff">memcpy</span>()函数不关心被复制的数据类型,只是逐字节的进行复制,这样可以面向任何数据类型进行复制。
</code></span>

【限制】:1. 如果src和dst所指的内存区域重叠,那么这个函数并不能够确保src所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向dst的指针。 2. 如果目标数组dst本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖length)。

<span style="color:#4b4b4b"><code class="language-scss"><span style="color:#880000">1</span>. 如果<span style="color:#a31515">src</span>和dst所指的内存区域重叠,那么这个函数并不能够确保<span style="color:#a31515">src</span>所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向dst的指针。
<span style="color:#880000">2</span>. 如果目标数组dst本身已有数据,执行<span style="color:#0000ff">memcpy</span>()后,将覆盖原有数据(最多覆盖length)。
</code></span>

【头文件】:C语言:#include<string.h>?

<span style="color:#4b4b4b"><code class="language-c">C语言:<span style="color:#2b91af">#<span style="color:#0000ff">include</span><span style="color:#3388aa"><string.h></span></span>
C++:<span style="color:#2b91af">#<span style="color:#0000ff">include</span><span style="color:#3388aa"><cstring></span></span>
</code></span>

2.2 memmove()函数

【原型】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#a31515">void</span> *<span style="color:#a31515">memmove</span>(<span style="color:#a31515">void</span> *dst, <span style="color:#a31515">void</span> <span style="color:#a31515">const</span> *src,<span style="color:#a31515">size_t</span> length);
</code></span>

【作用】:memmove()函数函数和memcpy()函数所进行的操作差不多,不过会考虑重叠的问题。 例如将ABC段复制到BCD段时,目标区域和源区域有重叠,当A段复制到B段时,B段发生损坏,无法再将完整的B段复制。因此发生存在区域重叠时采用逆向复制 A|B|C|D

<span style="color:#4b4b4b"><code class="language-less"><span style="color:#0000ff">memmove</span>()函数函数和<span style="color:#0000ff">memcpy</span>()函数所进行的操作差不多,不过会考虑重叠的问题。
例如将<span style="color:#0000ff">ABC</span>段复制到<span style="color:#0000ff">BCD</span>段时,目标区域和源区域有重叠,当<span style="color:#0000ff">A</span>段复制到<span style="color:#0000ff">B</span>段时,<span style="color:#0000ff">B</span>段发生损坏,无法再将完整的<span style="color:#0000ff">B</span>段复制。因此发生存在区域重叠时采用逆向复制
<span style="color:#0000ff">A</span>|<span style="color:#0000ff">B</span>|<span style="color:#0000ff">C</span>|<span style="color:#0000ff">D</span>
</code></span>

2.3 memset()函数

【原型】:

<span style="color:#4b4b4b"><code class="language-c"><span style="color:#a31515">void</span> *<span style="color:#a31515">memset</span>(<span style="color:#a31515">void</span> *s, <span style="color:#a31515">int</span> ch, <span style="color:#a31515">size_t</span> n);
</code></span>

【作用】:将s中当前位置后面的n个字节用 ch 替换并返回 s 。作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

<span style="color:#4b4b4b"><code class="language-x86asm">将s中当前位置后面的n个字节用 <span style="color:#880000">ch</span> 替换并返回 s 。作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
</code></span>

【头文件】:<memory.h>或<string.h>

<span style="color:#4b4b4b"><code class="language-c"><memory.h>或<<span style="color:#0000ff">string</span>.h></code></span>
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:25:04  更:2022-08-06 10:26:51 
 
开发: 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年4日历 -2024/4/26 15:05:39-

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