手写代码高频考点(二)
1、memcpy()
一般的函数实现
void* my_memcpy(void *dest, void *src, unsigned long count)
{
char *temp = (char *)dest;
const char* s = (const char*)src;
while (count--)
{
*temp++ = *s++;
}
return dest;
}
上面的实现存在缺陷
内存重叠会出现拷贝异常,举例:
int a[10] = {0,1,2,3,4,5,6,7,8,9,10};
//高地址向地址拷贝,拷贝正常
memcpy(a, a+3, sizeof(int) * 4);
//低地址向高地址拷贝,拷贝不正常
memcpy(a+3, a, sizeof(int) * 4);
预计结果:0,1,2,0,1,2,3,7,8,9,10
实际结果: 0,1,2,0,1,2,0,7,8,9,10
解决方法
-
直接使用memmove()函数
-
使用memcpy前做些判断
void* memcpy_s(void* dest, const void* src, unsigned int count)
{
assert((dest!=NULL) && (src != NULL));
if (dest >= src)
{
return memcpy(dest, src, count);
}
else
{
//优先拷贝重叠部分内容
char* temp;
const char* s;
temp = (char*)dest;
temp += count;
s = (const char*)src;
s += count;
while(count--)
{
*--temp = *--s;
}
}
return dest;
}
2、strcpy()
一般的函数实现
char* strcpy(char* dest, const char*src)
{
char* temp = dest;
const char* s = src;
while((*temp++ = *s++) != '\0');
return dest;
}
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式软件面试笔记 文章被收录于专栏
该笔记涵盖嵌入式软件工程师技术面试中的知识点,归纳总结为:C/C++、操作系统、计算机网络、数据结构与算法、linux常用命令等章节。