【C语言】 字符串的内存拷贝处理函数

这篇博文我主要是想写一下函数库中的memcpy函数,

对于字符串来说,我们运用字符串<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;
}

就是遇到被拷贝的空间起始处在拷贝空间中,将会遇到拷贝内存覆盖的现象。在这种情况下我们将考虑从尾部进行拷贝。所以进行了判断。

时间: 2024-10-15 00:34:26

【C语言】 字符串的内存拷贝处理函数的相关文章

c 语言 自己实现 内存拷贝函数 memmov()

/************************************************************************************1.模拟实现memmove函数的实现.(考虑内存重叠) ************************************************************************************/ #include<stdio.h> #include<string.h> #includ

【内存类操作】浅谈内存拷贝异常

结合本人在实际项目中所积累的经验,以及曾经犯过的错误,堆内存操作类函数做一个简单的剖析,抛砖引玉,欢迎大家吐槽. 首先,讲一下内存使用异常发生的几种场景. 1.野指针的使用,使用已经释放的指针,如果向野指针中写内容,就极有可能导致设备重启或任务挂死.因为,正在运行的任务的地址被意外的改写. [避免策略]函数入参要判空,指针使用(包括释放)之前一定要释放. 2.内存函数的错误使用: void *memset(void *s, int ch, size_t n); c语言中在<memory.h>或

【C语言】 字符串操作函数及内存拷贝函数归总

今天在这里把零散的一些常用的字符串操作函数和内存拷贝函数进行一下归总实现. 一 . 字符串操作函数 字符串操作函数有很多,这里我列举一些常用的函数,以及自实现的代码: 字符串拷贝函数: 函数原型: char* my_strcpy(char* dst,const char* src) strcpy(): char* my_strcpy(char* dst,const char* src) {     assert(dst);     assert(src);     char *ret = dst

[C] 语言字符串、文件及内存分配函数

一.字符串函数 1.gets() 头文件:#include <stdio.h> 函数原型:char *gets(char *string); 函数说明:从标准输入流(stdin)中读取整行,直至遇到换行符结束,然后丢弃换行符,储存其余字符,并在末尾加上空字符,表示一个字符串: 函数返回值:若成功则返回指向string的指针,否则返回NULL: 备注:与puts()函数配套使用:只知道string的开始出,不知道数组中有多少个元素,超出边界,容易造成缓冲区溢出. 2.fgets() 头文件:in

c++中内存拷贝函数(C++ memcpy)详解

原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. 举例: // memcpy.c #include <stdlib.h> #include <string.h> main() { char *s= "Golden Global View "; c

makefile规则编写&amp;C语言字符串拷贝&amp;vim介绍

makefile规则:[email protected]:目标文件$^:所有的依赖文件$<:第一个依赖文件-c:输出目标代码,不输出可执行文件-g:编译器编译的时候提供以后对程序调试的信息target:rules    gcc -o [email protected] $^install:    cp target /usr/local/binclean:    rm target    lib库查找方法:nm -o /lib/*.so | grep "函数名字" nm -o /

C语言字符串函数大全

转载自http://www.360doc.com/content/08/0723/22/26860_1462024.shtml# 函数名: stpcpy 功能: 拷贝一个字符串到另一个 用法: char *stpcpy(char *destin, char *source); 程序例: #include<stdio.h> #include<string.h> int main(void) { char string[10]; char *str1 = "abcdefghi

C语言字符串处理函数

函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) {    char string[10];    char *str1 = "abcdefghi";    stpcpy(string, str1);    printf("%sn&

字符串在内存中的存储——C语言进阶

字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中.不过,并非所有的字符数组都是字符串,字符数组可能没有NUL字符.字符数组也用来表示布尔值等小的整数单元,以节省内存空间. C中有两种类型的字符串: 单字节字符串 由char数据类型组成的序列 宽字符串 由wchar_t数据类型组成的序列 wchar_t数据类型用来表示宽字符,要么是16位宽,要么是32位宽.这两种字符串都以NUL结尾.可以在string.h中找到单字节字符串函