目录
内存函数是一组用于操作内存的函数,它们通过访问内存地址来操作对象。这些函数可以用于复制、移动、比较和设置内存中的数据。内存函数可以应用于任何类型的对象,不需要关心对象的具体类型。
此外,内存函数在遇到空字符(‘\0’)时不会停止复制。
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置--内存 的拷贝
如果source和destination有任何的重叠,复制的结果都是未定义的----这里对于重叠的就需要用到memmove函数来处理
需要注意的是在vs2022里,memcpy函数能够对重叠的部分进行使用,功能涵盖memmove函数.
我们可以对destination进行修改 从而实现arr2+3下标为3开始拷贝
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 5*sizeof(int));
for (int i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
这里使用void*接收返回值,这样可以接收任何类型的?
强制类型转化为char*,依次向后1个字节拷贝(+1)
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);
}
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr+1, arr, 5*sizeof(int));
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这里根据dest和src的位置分为,dest<=src从前往后排;dest>src以及未重叠部分从后往前排
dest<=src的情况即上述memcpy函数实现
第二种情况dest>src以及未重叠部分
这里我们从后往前排,可以避免因为重叠导致的数字消失
1 1 1 1 1//错误的结果——从前往排的情况下
1 1 2 3 4//正确的结果——从后往前排
void* my_memmove(void* dest,const void* src, size_t num)
{
void* ret = dest;
//从前往后
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);
}
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容
int main()
{
char str[] = "hello world";
memset(str, 'x', 6);
printf(str);
return 0;
}
xxxxxxworld//输出结果
比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
返回值如下
int main()
{
char buffer1[] = "DWga";
char buffer2[] = "DwGa";
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;
}
'DWga' is less than 'DwGa'.//输出结果
?对于c语言中内存函数就讲到这里,如果对你有用的话,希望能三连鼓励下,谢谢