一、memset 函数
memset 的功能是将指定区域的内存置空。 第一个参数是指定要置空内存的首地址,第二个参数一般写0,第三个参数是这块内存的大小,单位:字节。
例1 清空所有字节
#include <stdio.h>
#include <string.h>
int main ()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
memset(a, 0, sizeof(a));
int i;
for(i = 0; i < 10; i++)
{
printf("a[%d] = %d\n", i, a[i]);
}
return 0;
}
输出结果:
例2 清空固定字节数内存
#include <stdio.h>
#include <string.h>
int main ()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
memset(a, 0, 10); //只清空10个字节数的内存
int i;
for(i = 0; i < 10; i++)
{
printf("a[%d] = %d\n", i, a[i]);
}
return 0;
}
输出结果:
二、memcpy 函数
memcpy 功能是两块内存之间拷贝数据。 第一个参数是目标地址,第二个参数是源地址,第三个参数是拷贝多少内容,单位字节
例1 将 a 的内存中的数据拷贝到b中
#include <stdio.h>
#include <string.h>
int main ()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[10] = {0};
memcpy(b, a, sizeof(a));
int i;
for(i = 0; i < 10; i++)
{
printf("b[%d] = %d\n", i, b[i]);
}
return 0;
}
输出结果:
例2 若两个数组中数据类型不一致
#include <stdio.h>
#include <string.h>
int main ()
{
short a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[10] = {0};
memcpy(b, a, sizeof(a));
int i;
for(i = 0; i < 10; i++)
{
printf("%08x\n", b[i]); //十六进制输出
}
return 0;
}
输出结果:
结果分析:memcpy 函数在拷贝过程中是按内存拷贝的。因为两个数组中的数据类型不一致,所以才出现上述结果。
注
意
:
使
用
m
e
m
c
p
y
时
,
一
定
要
确
保
内
存
没
有
重
叠
区
域
。
\color{red}{ 注意:使用 memcpy 时,一定要确保内存没有重叠区域。 }
注意:使用memcpy时,一定要确保内存没有重叠区域。
例3 内存重叠说明
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[10] = {0};
memcpy(&a[3], &a[0], 20); //拷贝5个数据
从上述程序可以看出,源地址从a[0] 开始,而拷贝了5个数据,目标地址从 a[3] 开始,因此会造成内存重叠,如下图所示:
因此不要这样去拷贝,这样做事会出问题的。
三、memmove 函数(移动内存)
例1
#include <stdio.h>
#include <string.h>
int main ()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[10] = {0};
memmove(b, a, sizeof(a));
int i;
for(i = 0; i < 10; i++)
{
printf("%d\n", b[i]);
}
return 0;
}
输出结果: