C语言- 字符串的内存拷贝处理函数
程序员文章站
2022-03-24 23:53:10
对于字符串来说,我们运用字符串中的str类别的函数,但是我们还有一些关于内存的拷贝函数。他们操作的对象是内存,然后可以接受任何类型的数据进行拷贝。...
对于字符串来说,我们运用字符串<string.h>中的str类别的函数,但是我们还有一些关于内存的拷贝函数。他们操作的对象是内存,然后可以接受任何类型的数据进行拷贝。
这个是<memory.h>里面的memcpy,然后我们一起查看一下MSDN看一看他的原型:
void *memcpy(void *dest,const void *src,size_t count);
与strcpy不同的就是添加了第三个参数,确定操作的字节数,然后参数类型还有返回类型都是void*
,这表示他可以拷贝任意类型的数据。
然后我们看一下实现:
memcpy:
void *my_memcpy(void *str,const void *Dstr,int count) //从内存地址开始改变,并确定改变长度,所以用万能类型去接受 { char *pstr = (char *)str; char *pDstr = (char *)Dstr; assert((str!=NULL) && (Dstr != NULL)); if(str == Dstr) //位置相同情况下直接返回需要改变的 return (char *)Dstr; while(count-- > 0) { *pstr++ = *pDstr++; } return str; }
然后会出现一个问题,如果我们拷贝的数据中Dstr的起始位置在STR操作之间,那么在改变str时会出现副作用,将导致我们的拷贝结果不正确,所以我们应该考虑到会覆盖的情况。在函数库中有一个memmove函数。
memmove:
void *my_memmove(void *pst,const void *Dpst,int size) { void *p = pst; char *pstA = (char *)pst; char *pstB = (char *)Dpst; assert((pst != NULL) &&(Dpst != NULL)); if(pstB<pstA< pstB+size) { while(size--) { *(pstA+size) = *(pstB+size); } } else { while(size--) { *pstA++ = *pstB++; } } return p; }
就是遇到被拷贝的空间起始处在拷贝空间中,将会遇到拷贝内存覆盖的现象。在这种情况下我们将考虑从尾部进行拷贝。所以进行了判断。
上一篇: windows命令行
推荐阅读
-
C语言的字符串处理函数strlen()
-
C语言的字符串输出fputs()函数
-
C语言中堆内存的开辟和释放与内存处理函数
-
C语言——常用标准输入输出函数 scanf(), printf(), gets(), puts(), getchar(), putchar(); 字符串拷贝函数 strcpy(), strncpy(), strchr(), strstr()函数用法特点
-
C语言使用strcmp()函数比较两个字符串的实现
-
C语言:字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”。
-
C语言:实现一个函数,可以左旋字符串中的k个字符。
-
C语言实现返回字符串函数的四种方法介绍
-
C语言的字符串输出puts()函数
-
memcpy内存拷贝函数的写法c++代码实例及运行结果(代码教程)