关于memory的三个函数,再说一点点

经过修改,现在写成了这个样子:

#include<stdio.h>
#include<stdlib.h>
int memorycpy(void *dst,void *src,size_t n)
{
    size_t k;
    size_t i;
    if(n>=8){
        k=n;
        k>>=3;
        for(i=0;i<k;i++)
        *((long long*)dst++)=*((long long*)src++);
        n-=8*k;
    }
    if(n>=4){
        k=n;
        k>>=2;
    *((long*)dst++)=*((long*)src++);
        n-=4*k;
    }
    if(n>=2){
        k=n;
        k>>=1;
    *((short*)dst++)=*((short*)src++);
        n-=2*k;
    }
    if(n>=1){
        k=n;
    *((char*)dst++)=*((char*)src++);
    }
}
int main()
{
    char* src="1234567890";
    char* dst=(char*)malloc(11);
    memorycpy(dst,src,sizeof(src));
    printf("%s/n",dst);
    return 0;
}   

 

gcc编译能通过,但是运行结果不对,src小于或等于四字节时能打印出相应的字节,而大于四字节时还是只显示四字节,郁闷。

 

标记红色的地方语法到底对不对呢?在vc中为什么编译不过?对于红色的行显示error C2036: 'void *' : unknown size,这样到底能不能把dst先转换类型而后再自增1呢?

 

渴望高人指点。


 

老大写的确是好:

static int __memcpy_1byte__(void * dst, const void * src, size_t n)
{
    UI08 * d = dst;
    const UI08 * s = src;

    while(n --)
    {
        * d ++ = * s ++;
    }
       
    return 0;
}

static int __memcpy_2byte__(void * dst, const void * src, size_t n)
{
    UI16 * d = dst;
    const UI16 * s = src;

    while(n --)
    {
        * d ++ = * s ++;
    }
       
    return 0;
}

static int __memcpy_4byte__(void * dst, const void * src, size_t n)
{
    UI32 * d = dst;
    const UI32 * s = src;

    while(n --)
    {
        * d ++ = * s ++;
    }
       
    return 0;
}

static int __memcpy_8byte__(void * dst, const void * src, size_t n)
{
    UI64 * d = dst;
    const UI64 * s = src;

    while(n --)
    {
        * d ++ = * s ++;
    }
       
    return 0;
}

int memorycpy(void * dst, const void * src, size_t n)
{
    size_t i;
    BYTE * d = dst;
    const BYTE * s = src;

    i = n >> 3;
    if(i != 0)
    {
        __memcpy_8byte__(d, s, i);
        d = d + (i << 3);
        s = s + (i << 3);
        n = n - (i << 3);
    }
   
    i = n >> 2;
    if(i != 0)
    {
        __memcpy_4byte__(d, s, i);
        d = d + (i << 2);
        s = s + (i << 2);
        n = n - (i << 2);
    }

    i = n >> 1;
    if(i != 0)
    {
        __memcpy_2byte__(d, s, i);
        d = d + (i << 1);
        s = s + (i << 1);
        n = n - (i << 1);
    }

    if(n != 0)
    {
        __memcpy_1byte__(d, s, n);
    }

    return 0;
}

 

其中,UI08、UI16、UI32、UI64分别是unsigned char、unsigned short、unsigned long和unsigned long long,BYTE是unsigned char。

这样写,确实既清晰又简洁,真好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值