现在的位置: 首页 > 综合 > 正文

面试一道题!

2013年05月02日 ⁄ 综合 ⁄ 共 845字 ⁄ 字号 评论关闭

前几日,去一家做著名的半导体公司面试,其中问了一个关于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);
}

 

抱歉!评论已关闭.