前几日,去一家做著名的半导体公司面试,其中问了一个关于C的函数memmov();
现在想起来,按照他的要求,应该是memcpy()这个应该更确切一点。
这道题,要分内存块重叠和不重叠。
/* memcpy ─── 拷贝不重叠的内存块*/
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
void* pbTo = (byte*)pvTo;
void* pbFrom = (byte*)pvFrom;
while(size-->0)
*pbTo++ = *pbFrom++;
return(pvTo);
}
让代码检查自己的错误(利用assert断言)
aasert 是个只有定义了DEBUG 才起作用的宏,如果其参数的计算结果为假,就中止调用程序的执行
#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();
}
实例:/* memcpy ─── 拷贝不重叠的内存块*/
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
void* pbTo = (byte*)pvTo;
void* pbFrom = (byte*)pvFrom;
ASSERT(pvTo != NULL && pvFrom != NULL);
ASSERT(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
while(size-->0)
*pbTo++ = *pbFrom++;
return(pvTo);
}