memcpyでサイズエンドの問題が発生した場合

1705 ワード

memcpyのソースコードはchar型に対して処理されていることがよく見られますが、short intとcharが同時にパラメータとして扱われると、所望の結果が得られず、大小の災いになります.
#include 
#include 
#include 

void *first_memcpy(void *dest,void *src, unsigned int count)
{
	assert((dest!=NULL)&&(src!=NULL));
	int i=0,k=0;
	if(dest==src)
		return src;
	char* d=(char*)dest;
	char* s=(char*)src;
	
	while(count--> 0)
	{
		*d++=*s++;
	}
	return dest;
}


void *second_memcpy(void *dest,void *src, unsigned int count)
{
	assert((dest!=NULL)&&(src!=NULL));
	int i=0,k=0;
	if(dest==src)
		return src;
	unsigned short* d=(unsigned short*)dest;
	char* s=(char*)src;
	
	while(count--> 0)
	{
		
		d[i]=(s[k]<<8)|s[k+1];
		i+=1;
		k+=2;
	}
	return dest;
}


void main()
{
        int i;
        unsigned short des[24]={0};
        unsigned char src[13]={0x12, 0x34, 0x56, 0x78};
        memcpy(des,src,4);
        
        printf("1 memcpy:
"); for(i=0;i<4;i++) { printf("%04x,",des[i]); } printf("
"); first_memcpy(des,src,4); printf("1 first_memcpy:
"); for(i=0;i<4;i++) { printf("%04x,",des[i]); } printf("
"); second_memcpy(des,src,4); printf("1 second_memcpy:
"); for(i=0;i<4;i++) { printf("%04x,",des[i]); } printf("
"); }
実行結果:
1 memcpy: 3412,7856,0000,0000, 1 first_memcpy: 3412,7856,0000,0000, 1 second_memcpy: 1234,5678,0000,0000,
最後の状況こそ私たちが望んでいることです!