首页 > 其他分享 >随想录(用memmove函数代替strncpy函数)

随想录(用memmove函数代替strncpy函数)

时间:2022-11-23 11:33:00浏览次数:37  
标签:count src 函数 memmove dest 随想录 char tmp strncpy



 

    有过C语言编程的朋友应该都有过指针越界的困扰。不管越界的地方是全局地址、还是局部地址,查起来都是非常麻烦,原因大多时候都来自于自己对char数组类型的误用。很多同学可能都不是很清楚,在str系类的函数中,函数会在结尾的时候添加'\0'。比如说strncpy函数,在linux kernel上是这样写的,

 

/**
* strncpy - Copy a length-limited, %NUL-terminated string
* @dest: Where to copy the string to
* @src: Where to copy the string from
* @count: The maximum number of bytes to copy
*
* The result is not %NUL-terminated if the source exceeds
* @count bytes.
*/
char * strncpy(char * dest,const char *src,size_t count)
{
char *tmp = dest;

while (count) {
if ((*tmp = *src) != 0) src++;
tmp++;
count--;
}
return dest;
}

    而memmove函数是这样描写的,

 

/**
* memmove - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* Unlike memcpy(), memmove() copes with overlapping areas.
*/
void * memmove(void * dest,const void *src,size_t count)
{
char *tmp, *s;

if (dest <= src) {
tmp = (char *) dest;
s = (char *) src;
while (count--)
*tmp++ = *s++;
}
else {
tmp = (char *) dest + count;
s = (char *) src + count;
while (count--)
*--tmp = *--s;
}

return dest;
}

 

    通过上面的代码,我们发现memmove函数有几个好处,

    (1)会根据dest和src的地址关系灵活判断复制顺序;

    (2)不会额外添加'\0';

    (3)需要自己时刻关心当前字符串的大小问题;

    (4)memmove可以应用于各种数据结构,而不仅仅是char*类型。

 

标签:count,src,函数,memmove,dest,随想录,char,tmp,strncpy
From: https://blog.51cto.com/feixiaoxing/5880717

相关文章

  • 随想录(编写简单资源管理代码)
      不管编写什么软件,我们都会涉及到模块的编写。说是模块,其实就是管理一片资源,这些资源的概念很广,可以是内存、锁、socket、字符串、文件、空间大小等等。所以不管是什么......
  • 随想录(设计软件模块的接口)
       开发软件是一件复杂而且辛苦的工作,不同的模块之间的逻辑需要考虑,应用层与底层的关系也需要考虑。模块之间的关系处理不好,就会给软件的编写质量带来影响。当然不管软......
  • 随想录(矩阵计算的几种方法)
    【声明:版权所有,欢迎转载,请勿用于商业用途。】   要进行图像处理,矩阵运算是少不了的。不管是加减乘除,还是旋转、求逆、矩阵分解,都需要lib来好好支持。下面,主要就说一......
  • 随想录(机器学习的生产应用)
    【声明:版权所有,欢迎转载,请勿用于商业用途。     从范围上讲,人工智能>机器学习>模式识别。最近机器学习愈演愈烈,特别是深度学习的发展,极大的推动了机器学习的应......
  • 随想录(嵌入式工程师的出路)
    【声明:版权所有,欢迎转载,请勿用于商业用途。  嵌入式工程师分布在各行各业上面。这其中包括了消费电子、工业电子、汽车电子和军用电子等等。从功能上面看,嵌入式本身包......
  • 随想录(对比着c学java)
    【声明:版权所有,欢迎转载,请勿用于商业用途。  对于java,有两种论调。一种是鄙视,认为java是个人都能学,完全体现不出程序员的水平。还有一种,就是拔高java,认为java无所不能,j......
  • 随想录(被高估的busybox)
    【声明:版权所有,欢迎转载,请勿用于商业用途。  传统的嵌入式系统都是uboot+kernel+rootfs。其中最简单的rootfs就是ramfs+busybox+/dev+/etc+/lib。至于etc目录中的initt......
  • 随想录(c&cpp之间的相互调用)
    【声明:版权所有,欢迎转载,请勿用于商业用途。】  作为系统工程师,平时用c可能多一些。这两天因为工作的原因,了解了linux上面cpp的编写方法。很多时候,cpp对编写者的要求比......
  • 用汇编的眼光看C++(之虚函数)
       虚函数是面向对象设计中的一个重要内容。它的出现使得我们只需要相同的接口函数,并可以得到不同的生成结果。但是有些朋友却知其然,不知其所以然,为什么会出现这样的结......
  • 随想录(比技术更重要的是产品)
    【声明:版权所有,欢迎转载,请勿用于商业用途。  一般来说,做技术开发的同学往往对功能、技术和性能比较热衷,但是对产品却非常忽视。不管什么样的技术,最终都要以产品的形式......