内存拷贝和字符串拷贝

来源:互联网 发布:淘宝10元包邮在哪 编辑:程序博客网 时间:2024/05/17 06:04

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


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

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

//为了防止源字符串被修改,src应该为constchar *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

0 0