#include <stdio.h> #include <stdlib.h> //#define NDEBUG //禁用NDBUG #include <assert.h> typedef unsigned char byte; #define DEBUG //自定义的断言宏 /* memcpy ─── 拷贝不重叠的内存块*/ void* memcpy(void* pvTo, void* pvFrom, size_t size) { byte* pbTo = (byte*)pvTo; byte* pbFrom = (byte*)pvFrom; if(pvTo == NULL || pvFrom == NULL) { fprintf(stderr, "Bad args in memcpy\n"); abort(); } while(size-->0) *pbTo++ = *pbFrom++; return(pvTo); } void* memcpy2(void* pvTo, void* pvFrom, size_t size) { byte* pbTo = (byte*)pvTo; byte* pbFrom = (byte*)pvFrom; #ifdef DEBUG if(pvTo == NULL || pvFrom == NULL) { fprintf(stderr, "Bad args in memcpy\n"); abort(); } #endif while(size-->0) *pbTo++ = *pbFrom++; return(pvTo); } void* memcpy3(void* pvTo, void* pvFrom, size_t size) { byte* pbTo = (byte*)pvTo; byte* pbFrom = (byte*)pvFrom; assert(NULL != pvTo && NULL != pvFrom ); while(size-->0) *pbTo++ = *pbFrom++; return(pvTo); } #ifdef DEBUG void _Assert(char* , unsigned); /* 原型*/ #define ASSERT(f) \ if(f) \ NULL; \ else \ _Assert(__FILE__ , __LINE__)//这个宏定义不能放在表达式当中 #else #define ASSERT(f) NULL #endif void _Assert(char* strFile, unsigned uLine) { fflush(stdout); fprintf(stderr, "\nAssertion failed: %s, line %u\n",strFile, uLine); fflush(stderr); abort(); } void* memcpy4(void* pvTo, void* pvFrom, size_t size) { byte* pbTo = (byte*)pvTo; byte* pbFrom = (byte*)pvFrom; ASSERT(NULL != pvTo && NULL != pvFrom ); while(size-->0) *pbTo++ = *pbFrom++; return(pvTo); } /* memcpy ─── 拷贝不重叠的内存块*/ void* memcpy5(void* pvTo, void* pvFrom, size_t size) { byte* pbTo = (byte*)pvTo; byte* pbFrom = (byte*)pvFrom; ASSERT(NULL != pvTo && NULL != pvFrom ); //要使用断言对函数参数进行确认 ASSERT(pbFrom+size <= pbTo || pbTo+size <= pbFrom); /* 内存块重叠吗?如果重叠,就使用memmove */ while(size-->0) *pbTo++ = *pbFrom++; return(pvTo); } const int len = 20; int main() { char *pchFrom = new char[len]; pchFrom[0] = 's'; pchFrom[1] = '\0'; char *pchTo = NULL; //memcpy3(pchTo, pchFrom,len); //memcpy4(pchTo, pchFrom,len); memcpy5(pchTo, pchFrom,len); return 0; }