C语言库存函数
当有一块内存空间需要设置内容的时候,就可以使用memset 函数,值得注意的是memset 函数对内存单元的设置以字节为单位的。如果比较2块内存单元的数据的大小,可以使用memcpy 函数,这个函数的特点就是可以指定比较长度。memcmp 函数是通过返回值告知大小关系的。
·
1.memcpy
函数原型:
void memcpy (void * destination , const void * source , size_t num);
功能:
- memcpy 是完成内存块拷贝的,不关注内存中存放的数据是啥
- memcpy 从source 的位置开始向后复制num 个字节的数据到 destination 指向的内存位置。
- 如果source 和 destination 有任何重叠,复制的结果都是未定义的
- mencpy 的使用需要包含<string.h>
参数:
- destination:指针,指向目标空间,拷贝的数据存放在这里
- source:指针,指向源空间,要拷贝的数据从这里来
- num:要拷贝的数据占据的字节数
返回值:
拷贝完成后,返回目标空间的起始地址
1.代码演示
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}

2.模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
//void*用来接受任意类型的指针
void* memcpy(void* dst, const void* src, size_t count)
{
void* ret = dst;
assert(dst);
assert(src);
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return (ret);
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}

在模拟实现过程中,要用void*类型的指针,目的是为了接受任意类型的指针,并且在实现数据拷贝的时候要将指针强制转化为(char * )类型的,再加加,目的是一字节一字节地交换
2.memmove
函数原型:
void *memmove (void * destination , const void *source , size_t num );
功能:
- memmove 函数也是完成内存块拷贝的
- 和memcpy 的差别就是memmove 函数处理的源内存块和目标空间内存块可以重叠的。
- memmove 的使用需要包含<string.h>
参数:
- destination:指针,指向目标空间,拷贝的数据存放在这里
- source :指针,指向源空间,要拷贝的数据从这里来
- num:要拷贝的数据占据的字节数
返回值:
拷贝完成后,返回目标空间的起始地址
1.代码演示
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}

2.模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
void* memmove(void* dst, const void* src, size_t count)
{
assert(dst && src);
void* str = dst;
if (src >= dst)
{
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return str;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//memmove(arr1 + 2, arr1, 20);
memmove(arr1, arr1 + 3, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
dst = (char)dst - 1; src = (char)src - 1; 要减1的目的是要将指针定位到最后一个数据的最后一个字节。
3.memset
函数原型:
void * memset (void *ptr , int value ,size_t num );
功能:
- memset 函数是用来设置内存块的内容的,将内容中指定长度的空间设置为特定的内容。
参数:
- ptr:指针,指向要设置的内存空间,也就是存放了要设置的内存空间的起始地址。
- value:要设置的值,函数将会把value 值转换为 unsigned char 的数据进行设置的。也就是以字节为单位来设置内存块的。
- num:要设置的内存长度,单位是字节
返回值: 返回的是要设置的内存空间的起始地址。
1.代码演示
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "hello world";
memset(str, 'y', 8);
printf(str);
return 0;
}

2.总结
当有一块内存空间需要设置内容的时候,就可以使用memset 函数,值得注意的是memset 函数对内存单元的设置以字节为单位的。
4.memcmp
函数原型:
int memcpy (const void * ptr1 ,const void * ptr2 ,size_t num );
功能:
比较指定的两块内存块的内容,比较从ptr1 和ptr2 指针指向的位置开始,向后的num 个字节,memcmp的使用需要包含<string.h>
参数:
- ptr1:指针,指向一块待比较的内存块
- ptr2:指针,指向另外一块待比较的内存块
- num:指向的比较长度,单位是字节
返回值:
- < 0(负数) ptr1 中第一个不相等的字节 < ptr2 中对应字节(按 ASCII / 二进制值比较)
- = 0(零) 前 num 个字节全部相等
- > 0(正数) ptr1 中第一个不相等的字节 > ptr2 中对应字节
1.代码演示
#include<stdio.h>
#include<string.h>
int main()
{
char buffer1[] = "abcdefhijk";
char buffer2[] = "abcDefHijk";
int n = memcmp(buffer1, buffer2, sizeof(buffer1));
printf("%d ", n);
return 0;
}

2.总结
如果比较2块内存单元的数据的大小,可以使用memcpy 函数,这个函数的特点就是可以指定比较长度。
memcmp 函数是通过返回值告知大小关系的。
更多推荐


所有评论(0)