内存函数memset头文件,即对内存中的内容进行一定的操作,通过这种函数,我们并不会局限与数据的类型。下面大雄就为大家介绍一些常用的内存函数。
01
【() - 内存拷贝不重叠】
()指定头文件是:#
() 函数的声明方式如下:
void *memcpy(void *str1, const void *str2, size_t n)
参数讲解:
1、str1 → 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
2、str2 → 指向要复制的数据源,类型强制转换为 void* 指针。
3、n → 要被复制的字节数。实际上就是和无符号差不多的。
【注意】它的参数的数据类型是无类型指针,也就是说它所有的数据类型都是可以适用的,因为它是 void * 类型。
返回值讲解:该函数返回一个指向目标存储区 str1 的指针。
这个代码是把arr1的元素赋值给arr2的元素,但是只是赋值前五个元素。可以用()内存函数来进行实现。
代码示例:
int main(void){int arr1[10] = { 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));}}
运行结果:1 2 3 4 5 0 0 0 0 0
创建自定义函数实现()
【注意】在无类型指针数据类型的时候是不能直接进行解引用操作以及++--的,在这里转换成char*指针类型是最合适的,
代码示例:
void *my_memcpy(void *str1, const void *str2, size_t n){assert(str1 && str2 != NULL);void *ret = str1;while (n--){*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}return ret;}int main(void){int i;int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int arr2[10] = { 0 };int sz = sizeof(arr1) / sizeof(arr1[0]);int *ret = my_memcpy(arr2, arr1, 20);for (i = 0; i < sz; i++){printf("%d ", *(ret + i));}return 0;}
运行结果:1 2 3 4 5 0 0 0 0 0
那在这里假设我们想要从arr1当中第三个元素开始进行拷贝怎么办?只需要改变下()当中第二个参数就可以。
把上述代码的这段修改下即可:
int *ret = my_memcpy(arr2, arr1+2, 20);
只需要这个样子运行,结果就会从第三个元素开始,这里“+2”是下标,是从0开始的注意下这点。
运行结果:3 4 5 6 7 0 0 0 0 0
【注意】:函数应该拷贝不重叠的内存。
02
【() - 内存拷贝可重叠】
()指定头文件是:#
()函数的声明方式如下:
void *memmove(void *str1, const void *str2, size_t n)
参数讲解:
1、str1→ 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
2、str2 → 指向要复制的数据源,类型强制转换为 void* 指针。
3、n → 要被复制的字节数。该函数返回一个指向目标存储区 str1 的指针。
我们可以发现是和()一样的
返回值讲解:该函数返回一个指向目标存储区 str1 的指针。
用同一个数组名进行内存拷贝。
代码示例:
int main(void){int arr1[10] = { 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));}}
运行结果:1 2 1 2 3 4 5 8 9 10
【注意】:在这里如果用()函数的话是行的,这就是()函数和()函数的区别所在了。
创建自定义函数实现()
代码示例:
void *my_memmove(void *str1, const void *str2, size_t n){void *ret = str1;assert(str1 && str2 != NULL);if (str1 < str2){//前向后,小于。while (n--){*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}}else{//后向前,大于。while (n--){*((char*)str1 + n) = *((char*)str2 + n);}}return ret;}int main(void){int i = 0;int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };// 1 2 1 2 3 4 5 8 9 10my_memmove(arr1+2, arr1, 20);return 0;}
str1 > str2运行结果:
1 2 1 2 3 4 5 8 9 10
再来看看str2<str1的调试结果,把上述代码的这段修改下即可:
my_memmove(arr1, arr1+2, 20);
str2<str1运行结果:
3 4 5 6 7 6 7 8 9 10
03
【() - 内存比较】
() 指定头文件是:#
() 函数的声明方式如下:
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
参数讲解:
1、ptr1 → 指向内存块的指针。
2、str2 → 指向内存块的指针。
3、n → 要被比较的字节。
返回值讲解:
1、返回值 < 0,表示ptr1小于ptr2。
2、返回值 > 0,表示ptr1大于ptr2。
3、返回值 = 0,表示ptr1等于ptr2。
代码示例:
int main(void){char str1[15] = {0};char str2[15] = {0};int ret = 0;memcpy(str1, "ABCDEF", 6);memcpy(str2, "ABCDEF", 6);ret = memcmp(str1, str2, 1);if (ret > 0){printf("str2 小于 str1");}else if (ret < 0){printf("str1 小于 str2");}else{printf("str1 等于 str2");}return 0;}
运行结果:str1 等于 str2
【注意】两组数组名是相同的,所对应的ASCII码值。
()源程序
代码示例:
int __cdecl memcmp (const void * buf1,const void * buf2,size_t count){if (!count)return(0);{__declspec(dllimport)size_t RtlCompareMemory( const void * src1, const void * src2, size_t length );size_t length;if ( ( length = RtlCompareMemory( buf1, buf2, count ) ) == count ) {return(0);}buf1 = (char *)buf1 + length;buf2 = (char *)buf2 + length;}while ( --count && *(char *)buf1 == *(char *)buf2 ) {buf1 = (char *)buf1 + 1;buf2 = (char *)buf2 + 1;}return( *((unsigned char *)buf1) - *((unsigned char *)buf2) );}
04
【() - 内存填充块】
() 指定头文件是:#
() 函数的声明方式如下:
void * memset ( void * ptr, int value, size_t num );
参数讲解:
1、ptr→指向要填充的内存块的指针。
2、value→要设置的值。该值作为int类型传递memset头文件,但该函数使用该值的 char转换填充内存块。实际上就是我们所要初始化的内容。
3、num→要设置为该值的字节数。是一个无符号整型类型。
返回值讲解:返回ptr。
代码示例:
int main(){char str[] = " yysyyyds!";memset(str, 'C', 1);puts(str);return 0;}
运行结果:
()源程序
代码示例:
void * __cdecl memset (void *dst,int val,size_t count){void *start = dst;{__declspec(dllimport)void RtlFillMemory( void *, size_t count, char );RtlFillMemory( dst, count, (char)val );}while (count--) {*(char *)dst = (char)val;dst = (char *)dst + 1;}return(start);}
活动
热门
等等!还没完,新月份新气象
针对各位卷王
我们更新升级了两门专属课程
帮你开拓编程之路
限时“骨折”优惠中……
快来薅羊毛吧!