C语言内存函数
1.memcpy函数
语法:
void * memcpy(void*destination,const void *source,size_t num)
首先看返回类型,返回的是void *指针,其指向的是destination的首地址,destination也是void*指针,这表明destination可以接收任意类型的指针,而后面的 *source 被const修饰,这样限制了 *source,更安全.
memcpy函数从cpy这三个字母就可以看出这是一个与拷贝有关的函数是关于内存的.它可以这样描述: 函数memcpy从source位置开始向后复制num个字节的数到destination指向的内存地址.
该函数遇到'\0'不会停止.如果destination与source有任何重叠,结果都是未定义的,最好不要这么干,但是在VS2022中,是可以的其他的编译器未知.
那么下面对该函数进行简单的实现
void * my_memcpy(void * dest,const void * src,size_t num)
{
void * ret=dest;
while(num--)
{
(char*)dest=(char*src);
dest=(char*)dest+1;
src=(char*)src+1;
}
return ret;
}
int main()
{
int arr1[10]={0};
int arr2[5]={1,2,3,4,5};
my_memcpy(dest,src,sizeof(int)*5);
for(int i =0;i<sizeof(arr1)/sizeof(arr1[0]);i++)
{
printf("%d ",arr[i];
}
return 0
}
2.memmove()
memmove函数比较强大,它可以处理重叠的内存块.该函数的功能和memcpy几乎一样.
语法:
viod * memmove(void * dest,const void * src,size_t num)
那么下面我们简单的实现一下:
void* my_memmove(void* dest, const void* src, size_t num)
{
char* ret = dest;
//当 dest<src 从前向后拷贝
if (dest <src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
//从后向前拷贝
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1+2,arr1,20);
for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
3.memset函数
memset函数是用来设置内存,将内存里的值设置成想要的内容,使用代码如下:
int main ()
{
char str[] = "hello world";
memset (str,'x',6);
printf(str);
return 0;
}
对了这是语法:
void * memset ( void * ptr, int value, size_t num );
注意这个函数是以字节为单位操作,别的不行
4.memcpy
memcpy函数⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节 ,这个和strcpy很像,不过这个可以指定起始位置,来比较大小.
语法如下:
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
使用方法可以参考下面代码:
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' is less than '%s'.\n", buffer1, buffer2);
else
printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
return 0;
}