一个实现与memcpy一样功能的函数

面试一家公司,要求实现memcpy一样功能的函数,做一个笔记

 

void *myMemcpy(void *dest, const void *src, size_t count)

{

//check input

if(!dest || !src || count<=0) return;

 char *tmp = dest;

 const char *s = src;

 while (count--)

  *tmp++ = *s++;

 return dest;

}

### C语言中 `memset` 功能相同或相似的替代函数 #### 使用循环手动填充内存 可以通过编写一个简单的循环来逐字节设置数组中的值。这种方法虽然效率较低,但在某些情况下可能更直观。 ```c void manual_memset(void *dest, int value, size_t count) { unsigned char *p = (unsigned char *)dest; while (count--) { *p++ = (unsigned char)value; } } ``` 此代码片段展示了如何通过遍历指针并赋值的方式来模拟 `memset` 的行为[^3]。 #### 利用标准库其他函数组合实现 除了直接替换外,还可以考虑利用多个标准库函数配合工作以达到类似的效果。例如结合 `memcpy` 和预先准备好的缓冲区: ```c #include <string.h> // 假设要清零一块较大的区域 char buffer[1024]; void clear_buffer_with_memcpy(char *buf, size_t n) { memset(buffer, 0, sizeof(buffer)); // 初始化一次大块空间 while(n >= sizeof(buffer)) { memcpy(buf, buffer, sizeof(buffer)); buf += sizeof(buffer); n -= sizeof(buffer); } if(n > 0){ memset(buf, 0, n); // 处理剩余部分 } } ``` 这种方式适用于批量操作较大范围的数据时提高性能[^2]。 #### 自定义宏定义 对于特定场景下的优化需求,也可以采用宏定义的方式来进行简化和加速: ```c #define MY_MEMSET(dest,val,size) do { \ unsigned char *_d=(unsigned char*)(dest); \ for(size_t _i=0;_i<(size);++_i){*_d++=(unsigned char)(val);}\ } while(0) int main(){ char str[]="hello"; MY_MEMSET(str,'A',sizeof(str)-1); puts(str); return 0; } ``` 上述例子中定义了一个名为 `MY_MEMSET` 的宏,在实际应用中可以根据具体情况进行调整[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值