memcpy() 的解释:

void* memcpy(void* dst, const void* src, size_t n);

// if copying takes place between objects that overlap, the behavior is undefined.

因此自己动手实现 memcpy()时需要考虑地址重叠的情况。

 

另外,标准库也提供了地址重叠时的内存拷贝函数:memmove(), memmove()把源字符串拷贝到临时buf 里,然后再从临时 buf 里写到目的地址。

memcpy 的问题

void* memcpy(void* dst, void* src, size_t size) {
	char* psrc;
	char* pdst;

	if(NULL == dst || NULL == src) {
		return NULL;
	}

	if(src < dst && (char*)src + size > (char*) dst) {
		psrc = (char*) src + size - 1;
		pdst = (char*) dst + size - 1;
		while(size--) {
			*pdst-- = *psrc--;
		}
	} else {
		psrc = (char*) src;
		pdst = (char*) dst;
		while(size--) {
			*pdst++ = *psrc++;
		}
	}
	return dst;
}

  

B公司面试第一道题

1. 没能考虑到 src, dst 重复的情况

2. strlen 的参数只能是 char*

3. 对 (void*) 这种东西,不能用 src[0] 而应该是 *src, *dst

相关文章:

  • 2021-07-28
  • 2021-10-12
  • 2022-12-23
  • 2021-11-08
  • 2021-05-15
  • 2021-10-21
  • 2022-01-15
  • 2021-10-12
猜你喜欢
  • 2021-11-08
  • 2022-12-23
  • 2021-04-04
  • 2022-02-07
  • 2021-07-26
  • 2021-09-30
  • 2022-12-23
相关资源
相似解决方案