C和指针之字符串memcpy、memmove、memset使用总结

来源:互联网 发布:社交网络关系图 编辑:程序博客网 时间:2024/05/20 11:23

1、介绍memcpy、memmove、memset

1) void *memcpy(void *dest, const void *src, size_t n);

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中


2) void *memmove( void* dest, const void* src, size_t count );

从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中



3) void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法[




2、测试Demo

#include <stdio.h>#include <string.h>//memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的始位置中//memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中//memset将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值,它是结构体或数组进行清零操作一种最方法,一般都是按字节进行赋值//因为memset是以字节为单位就是对array指向的内存的4个字节进行赋值,字节,合一起就是00000001000000010000000100000001,就等于16843009//memset对非字符型数组赋初值是不可取int main(){char *src = "chenyuchenyu";char des_one[30];char des_two[30];//从头开始复制memcpy(des_one, src, strlen(src) + 1);printf("des_one is %s\n", des_one);//从src中间位置开始复制memcpy(des_two, src + 5, 5);printf("des_two is %s\n", des_two);//复制后覆盖原有数据char src_one[] = "***";char des_three[] = "chenyu";memcpy(des_three, src_one, strlen(src_one));printf("des_three is %s\n", des_three);//目标和源有重叠用memmovechar src_two[] = "chenyuhelloword";memmove(src_two, src_two + 7, strlen(src_two) + 1 -7);printf("src_two is %s\n", src_two);char src_three[5];memset(src_three, '1', 5);for (int i = 0; i < 5; i++){printf("src_three[%d] is %c\n", i, src_three[i]);}    int  src_four[5];memset(src_four, 1, 20);for (int i = 0; i < 5; i++){printf("src_three[%d] is %d\n", i, src_four[i]);}/**这里是字符串常量不能被修改,所以这里编译可以运行会出错char *sss = "chenyu";memset(sss, 'c', 3);printf("sss is %s\n", sss);**/return 0;}





3、运行结果

des_one is chenyuchenyudes_two is uchendes_three is ***nyusrc_two is ellowordsrc_three[0] is 1src_three[1] is 1src_three[2] is 1src_three[3] is 1src_three[4] is 1src_three[0] is 16843009src_three[1] is 16843009src_three[2] is 16843009src_three[3] is 16843009src_three[4] is 16843009





4、分析

memset是按照字节单位来赋值的,memset是以字节为单位就是对src_four指向的内存的4个字节进行赋值,字节,合一起就是00000001000000010000000100000001,就等于16843009

 所以我们不能对非字符类型的数组进行赋值,一般对字符数组进行赋值,除非对非字符数组置为0


原创粉丝点击