手写代码高频考点(二)

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常用命令等章节。

全部评论
爱了爱了
1 回复 分享
发布于 2023-02-13 13:27 山东
谢谢大佬的整理
1 回复 分享
发布于 2023-02-13 13:39 重庆

相关推荐

昨天 09:08
裁应届生,一分钱补偿没有,离职了还脑控你,跟踪你,定位你,丁东服务是搞系每一个人
牛客吹哨人:建议细说...哨哥晚点统一更新到黑名单:不要重蹈覆辙!25届毁意向毁约裁员黑名单https://www.nowcoder.com/discuss/1317104
叮咚买菜稳定性 9人发布 投递叮咚买菜等公司10个岗位 >
点赞 评论 收藏
分享
2 8 评论
分享
牛客网
牛客企业服务