sizeof()与strlen()的区别 memcpy memmove区别和实现

sizeof()与strlen()的区别

     首先需要说明的是sizeof和strlen都可以求长度,但是却有很大的区别,简单来说可以概括为以下几点:

     1、sizeof是一个关键字,而strlen确实一个函数。

     2、sizeof求的是字节长度,而strlen求的却是实际长度。

        比如int a=1;sizeof(a)==4而strlen(a)=1

     3、sizeof求的是分配过来的长度,而strlen求的却是实际使用的长度。

       比如:char a[30]="abcd";

       sizeof(a)=30;而strlen(a)=4;

     4、strlen求的长度是以'\0'结束的。

       比如char a[30];strlen(a)的结果是不定的,而sizeof(a)=30;

        同理:char a[30]={'a','b','c'};对于strlen来说也是不定的,而sizeof却是30.

     以上四点便是sizeof和strlen的简要区别,给自己提个醒,也给别人提个醒。

      另外@小知了了指出,sizeof是在编译是计算的,而strlen是在运行是计算的。



memcpy memmove区别和实现

memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。

但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

memmove的处理措施:

(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝

(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝

(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

-- memcpy实现

1
2
3
4
5
6
7
8
void memcpy ( void * dest,  const  void * src,  size_t  n)
{
     char *      d = ( char *) dest;
     const  char *  s = ( const  char *) src;
     while (n-–)
        *d++ = *s++;
     return  dest;
}

 

-- memmove实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void memmove ( void * dest,  const  void * src,  size_t  n)
{
     char *     d  = ( char *) dest;
     const  char *  s = ( const  char *) src;
  
     if  (s>d)
     {
          // start at beginning of s
          while  (n--)
             *d++ = *s++;
     }
     else  if  (s<d)
     {
         // start at end of s
         d = d+n-1;
         s = s+n-1;
  
         while  (n--)
            *d-- = *s--;
     }
     return  dest;
}

 示意图:

(1)内存低端 <-----s-----> <-----d-----> 内存高端 start at end of s
(2)内存低端 <-----s--<==>--d----->      内存高端 start at end of s
(3)内存低端 <-----sd----->              内存高端 do nothing
(4)内存低端 <-----d--<==>--s----->      内存高端 start at beginning of s
(5)内存低端 <-----d-----> <-----s-----> 内存高端 start at beginning of s

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值