C++面试题4:memcpy的用法

C++面试题4:memcpy的用法

memcpy函数用于把资源内存(src所指向的内存区域)拷贝到目标内存(desk所指向的内存区域);拷贝多少个?有一个size变量控制

用法:可以拷贝任何类型的对象,因为函数的参数类型是void*,也就是说传进去的实参可以是int
*
,short*,char*等等。

原型:void *memcpy(void *desc, void *src, unsigned int
count)

实现memcpy

void *memcpy(void *desc,const void *src,size_t size)
{
    //非法输入
    if(desc == NULL || src == NULL)
    {
        return 0;
    }

    //由于函数拷贝是一个字节一个字节拷贝的,所以要进行类型转换
    unsigned char *desc1 = (unsigned char *)desc;
    unsigned char *src1 = (unsigned char *)src;

    while(size--)
    {
        *desc1=*src1;
        desc1++;
        src1++;
    }
    return desc;
}
这个程序不足的地方在于没有考虑覆盖重叠的情况。如果desc>src但是src+count>desc,我们这个时候复制就一定要注意了。
准确代码.cppvoid *memcpy(void *desc,const void *src, size_t size)
{
    //非法输入
    if(desc == NULL || src == NULL)
    {
        return 0;
    }

    unsigned char *desc1 = (unsigned char *)desc;
    unsigned char *src1 = (unsigned char *)src;

    if(desc1 > src1 && src1 + size > desc)
    {
        for(size_t i = size-1; i >= 0; i--)
        {
            desc1[i]=src1[i];
        }
    }
    else
    {
        for(size_t i = 0; i < n; i++)
        {
            desc1[i]=src1[i];
        }
    }
    return desc;
}

《编写高质量代码:改善C++程序的150个建议》建议20:使用memcpy()系列函数一定要足够小心

memcpy()、memset()、memcmp()等这些内存操作函数经常会帮我们完成一些数据复制、赋值等操作。因为在C语言中,无论是内置类型,还是自定义的结构类型(struct),其内存模型对于我们来说都是可知的、透明的。所以,我们可以对该对象的底层字节序列一一进行操作,简单而有效。

在传统C风格中的数据类型叫做POD对象,即一种古老的纯数据,其二进制内容可以随意复制的,所以我们可以大胆的使用memset()、memcpy()、memcmp()等函数对对象的内存进行操作。

但是在C++中,要注意了,C++对象可能不是一个POD,这是为什么呢?

这就从C++动多态说起,动多态的一个基本支撑技术就是虚函数,在使用虚函数时候,类的每一次继承都会产生一个虚函数表(vtable),其中存放的是指向虚函数的指针,这些虚函数表必须存放在对象体中,也就是和对象的数据内存放在一起,所以对象数据的内存并不是以连续的方式存放的,而是被切割成了不同的部分,既然对象的数据不再集中在一起,如果这个时候使用memcpy,会带来不可以预计的后果。

总结:要区分哪些数据对象是POD,哪些是非POD。由于非POD对象存在,在C++中使用memcpy()系列的函数一定要保持足够小心

时间: 2024-10-21 16:39:17

C++面试题4:memcpy的用法的相关文章

memcpy的用法及实现

memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,返回dest所指内存地址的起始位置. #include <string.h>#include <stdio.h>#include <stdlib.h>void* Memcpy(void *dst, const void *src, size_t size){    if((dst==NULL)||(src==NULL)) return NULL;    c

memcpy函数用法

memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. 举例: //

memcpy的用法总结

memcpy的用法总结 1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(void *dest, void *src, unsigned int count);用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*,short*,char*等等,但是由于函数拷贝的过程是一个字节一个字节的拷

memcpy函数用法(转)

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

转: memcpy的用法总结

1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(void *dest, void *src, unsigned int count);用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*,short*,char*等等,但是由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候

转:memcpy的用法总结

1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(void *dest, void *src, unsigned int count);用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*,short*,char*等等,但是由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候

转载------------C函数之memcpy()函数用法

转载于http://blog.csdn.net/tigerjibo/article/details/6841531 函数原型 void *memcpy(void*dest, const void *src, size_t n); 功能 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内. 头文件 #include<string.h> 返回值 函数返回一个指向dest的指针. 说明 1.source和destin所指内存区域不能重叠,函数返回指向dest

memset,memcpy,memcmp用法

void* memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值. 例如:memset(lpMyStruct, 0, sizeof(MyStruct));初始化结构体. void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 注意:如果n大于dest所指向的内存大

memcpy的用法与strcpy的区别及纯c语言实现

void * memcpy ( void* destination, const void * source, size_t num ); 函数功能: 由source所指内存区域复制num个字节到destination所指内存区域. 函数返回: 指向destination的指针. 1 memcpy可以复制任意内容,例如字符数组.整型.结构体.类等. 2 memcpy根据其第3个参数决定复制的长度,strcpy不需要指定长度,它遇到字符串结束符"\0"便结束. 3 通常在复制字符串时用s