1.memset函数
memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的;
包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化;
原型为 :
void *memset(void *s, int v, size_t n);
这里s可以是数组名,也可以是指向某一内在空间的指针;
v为要填充的值;
n为要填充的字节数;
例:
struct data
{
char num[100];
char name[100];
int n;
};
struct data a, b[10];
memset( &a, 0, sizeof(a) ); //注意第一个参数是指针类型,a不是指针变量,要加&
memset( b, 0, sizeof(b) ); //b是数组名,就是指针类型,不需要加&
注意,memset是逐字节 拷贝的
2. memcpy函数
功能
memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
头文件
所在头文件 <string.h>或< cstring >
函数原型
_CRTIMP int __cdecl __MINGW_NOTHROW memcmp (const void*, const void*, size_t) __MINGW_ATTRIB_PURE;
参数含义:
- 第一个参数:目的地址
- 第二个参数:源地址
- 第三个参数:所需要复制的字节数
程序用例
- 目的地址与原地址数据宽度相同的时候
int main()
{
char a[4] = "mmmm";
char b[7] = "123455";
memcpy(b,a,3);
printf("%d\n\r",sizeof(b));
printf("%s\n",b);
for(int i = 0; i < sizeof(b); i++)
printf("b[%d]的字符串是%c\n\r",i,b[i]);
return 0;
}
运行结果
可以看出memcpy函数只复制需要size_t个字节数据到目的地址,目的地址size_t之后的数据并不会改变
- 目的地址的宽度比原地址不相等时
int main() { //源地址数据宽 short c[5] = {0x1234,0x5678,0x2345,0x3390}; char d[10] = {0}; memcpy(d,c,6); for(int i = 0; i < sizeof(d); i++) printf("d[%d]的值是%x\n\r",i,d[i]); return 0; }
运行结果
先复制的是低位,再复制的是高位。
- 复制之后再还原
int main() { char a[8] = "abcdef"; short b[4] = {0x17,0x18,0x19,0x19}; memcpy(b,a,6); char d[10] = {0}; memcpy(d,b,6); for(int i = 0; i < sizeof(d); i++) printf("d[%d]的值是%x\n\r",i,d[i]); return 0; }
运行结果