手写几个重要的库函数 strcpy,strncpy,memcpy,memset
2016-08-20 21:41
627 查看
手写几个重要的库函数 strcpy,memcpy,memset
相关连接:http://www.cnblogs.com/t427/archive/2012/11/13/2768855.html
http://blog.csdn.net/winglet/article/details/2831605
1.strcpy
2.memcpy
面试中如问到memcpy的实现,那就要小心了,这里有陷阱。
先看下标准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(),那么为什么还要考虑重写memcpy()函数呢?
因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。
相关连接:http://www.cnblogs.com/t427/archive/2012/11/13/2768855.html
http://blog.csdn.net/winglet/article/details/2831605
1.strcpy
<span style="font-family:Microsoft YaHei;font-size:14px;">char * strcpy(char *dst,const char *src) { assert(dst != NULL && src != NULL); char *ret = dst; //[3] while ((*dst++=*src++)!='\0'); return ret; }</span>
2.memcpy
面试中如问到memcpy的实现,那就要小心了,这里有陷阱。
先看下标准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(),那么为什么还要考虑重写memcpy()函数呢?
因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。
<span style="font-family:Microsoft YaHei;font-size:14px;">void *Memcpy(void *dst, const 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; }</span>3.memset
<span style="font-family:Microsoft YaHei;font-size:14px;">void *(memset) (void *s,int c,size_t n) { const unsigned char uc = c; unsigned char *su; for(su = s;0 < n;++su,--n) *su = uc; return s; } </span>
相关文章推荐
- 几个重要库函数的实现-strcpy,strncpy,memcpy,memset
- 几个重要库函数的实现-strcpy,strncpy,memcpy,memset
- 几个重要库函数的实现-strcpy,strncpy,memcpy,memset
- 几个重要库函数的实现-strcpy,strncpy,memcpy,memset
- 几个重要库函数的实现-strcpy,strncpy,memcpy,memset
- 几个重要的库函数strcpy , strncpy, memcpy实现
- 纯C 字符串操作函数 实现 (strcpy, strncpy, memcpy, memset, strcat, strlen ... )
- memcpy、strcpy、strncpy、strlen、strcat几个函数的实现
- C/C++面试常见的几个库函数详解(strcpy,memcpy,memset,atoi...)
- memmove和memcpy 以及strcmp strcpy几个库函数的实现
- 实现memcpy、memcpy的优化、memmove、memset、strcpy、strncpy
- strcpy,memcpy,memmove,memset,strncpy
- std::strcpy、strncpy、memset、memcpy用法
- memset(),memcpy(),memccpy(),memmove(),bcopy(),strcpy(),strncpy()
- 纯C 字符串操作函数 实现 (strcpy, strncpy, memcpy, memset, strcat, strlen ... ) .
- C/C++面试常见的几个库函数详解(strcpy,memcpy,memset,atoi...)
- C之memset、memcpy、strcpy、strncpy区别
- strcpy,memcpy,memmove,memset,strncpy
- C/C++面试常见的几个库函数详解(strcpy,memcpy,memset,atoi...)
- strcat、strcmp、strcpy、strncpy、memset、memcpy、memmove和atoi函数源码