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>