内存拷贝和字符串拷贝

这两个题是面试中的常考题


assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

1 先讨论下字符串拷贝,因为这个比较简单,但是还是有一些细节需要注意。我面试的时候就忘了写const

//为了防止源字符串被修改,src应该为const
char *strcpy(char *dst, const char *src);
 {
      //空指标检查
      assert((dst!=NULL) && (src !=NULL)); 

      char *address = dst; 
      while( (*dst++ = *src++) != ‘/0’ ) NULL ;
      return address ; 
 }

2 内存拷贝,分为两种情况,一种是源内存区域和目标内存区域没有重叠的情况,另一种是有重叠的情况。

// 功能:由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内。
// 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针
void *memmcpy(void *dest , const void *src , size_t count)
{
	assert( (dest != NULL) && (src != NULL));     //安全检查
	assert( count > 0 );

	char *psrc = (char *) src;
	char *pdest = (char *) dest;
	while( count-- )
		*pdest++ = *psrc++;

	return dest;
}

// 功能:由src所指内存区域复制count个字节到dest所指内存区域。
// 说明:src和dest所指内存区域可以重叠,但复制后dest内容会被更改。函数返回指向dest的指针
void *memcpy(void *dest , const void *src , size_t count)
{
	assert( (dest != NULL) && (src != NULL));     //安全检查
	assert( count > 0 );

	char *psrc = (char *) src;  //可以保持src里面的值不变,否则后面的自增会改变里面存放的值
	char *pdest = (char *) dest;
	//检查是否有重叠问题
	if( pdest < psrc )
	{
		//正向拷贝
		while( count-- )
			*pdest++ = *psrc++;
	}
	else if( psrc < pdest )
	{
		//反向拷贝
		psrc = psrc + count - 1;
		pdest = pdest + count - 1;
		while( count-- )
			*pdest-- = *psrc--;
	}
	return dest;
}



Reference:

http://blog.csdn.net/linuxlinuxlinuxlinux/article/details/9498685

http://blog.csdn.net/wanwenweifly4/article/details/6409877

你可能感兴趣的:(内存拷贝,字符串拷贝)