经过修改,现在写成了这个样子:
#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。
这样写,确实既清晰又简洁,真好。