首页 > 编程语言 > 详细

C语言内存操作函数

时间:2020-03-12 00:09:05      阅读:64      评论:0      收藏:0      [点我收藏+]

memcpy:

void * memcpy ( void * destination, const void * source, size_t num ); 

从source复制数据给dest,注意size_t是字节数,和类型无关。比如可以这样调用:
int main()
{
    int p[3] = { 4,4,4 }, q[3] = { 2,2,2 };
    memcpy(p, q, 3 * sizeof(int));
    return 0;
}

其中要指定3个int的长度,一共复制12个字节。

 

memmove:

void * memmove ( void * destination, const void * source, size_t num );

和memcpy功能相似,但函数内部会防止在复制过程中抹除原位置数据,比如对于一个数组p我们memcpy(p+2,p,5*sizeof(int));可以看到我们复制第一个int时候,把第3个位置的p[2]数据复写了。

技术分享图片

 

 

 memmove与memcpy的区别就是可以识别到这种内存重合,在这种情况下从后往前复制数据,这样就不会产生数据复写导致丢数据。

内部实现原理是一个if else语句,对内存是否有重合两种情况分别进行处理。其中查看内存是否重合是用一个宏__np_anyptrlt。c语言实现代码如下:

#include <stddef.h> /* for size_t */
void *memmove(void *dest, const void *src, size_t n)
{
    unsigned char *pd = dest;
    const unsigned char *ps = src;
    if (__np_anyptrlt(ps, pd))
        for (pd += n, ps += n; n--;)
            *--pd = *--ps;
    else
        while(n--)
            *pd++ = *ps++;
    return dest;
}

 

 

memcpr:

void * memcpy ( void * destination, const void * source, size_t num );
比较二者每个字节的大小(按ASCII大小比较,所以‘g‘是大于‘G‘的,小写字母大于大写字母)
注:‘0‘:48,‘A‘:65,‘a‘:97

 

 

 

memset:

void * memset ( void * ptr, int value, size_t num );
将ptr之后num个字节填充为value。

 

/* memset example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "almost every programmer should know memset!";
  memset (str,-,6);
  puts (str);
  return 0;
}

技术分享图片

 

 

 





C语言内存操作函数

原文:https://www.cnblogs.com/FdWzy/p/12466479.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!