这两个题是面试中的常考题
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.youkuaiyun.com/linuxlinuxlinuxlinux/article/details/9498685
http://blog.youkuaiyun.com/wanwenweifly4/article/details/6409877