C语言里的strcpy()

全局区/静态区(Global Static Area):并且在C语言中初始化的全局变量和静态变量放在同一个块,未初始化的全局变量放在另一个块(在C++中,由于全局变量和静态变量编译器会给这些变量自动初始化赋值,所以没有区分,都在一起)。

#include <cstdio>
#include <cstring>

using namespace std;
char a[5]={'A','B','C','D','E'};
//char c[5]={'0','1','2','3','4'};
//char e[10]={'0','1','2','3','4','5','6','7','8','9'};

char b[10]={'0','1','2','3','4','5','6','7','8','9'};
char d[10]={'a','b','c','d','e','f','g','h','i','j'};
char f[5]={'!','@','#','$','%'};
int main()
{

     for(int i=0;i<5;i++){
        printf("%c  loc  %x\n",a[i],&a[i]);
    }
    printf("---------------\n");
    for(int i=0;i<10;i++){
        printf("%c loc  %x\n",b[i],&b[i]);
    }
     printf("---------------\n");
    for(int i=0;i<10;i++){
            printf("%c loc  %x\n",d[i],&d[i]);
    }
   strcpy(a,b);
     printf("--------strcpy-------\n");
   // char *p=b;
    //char *p1=a;
   // for(int i=0;i<10;i++){
   //     *(p1+i)=*(p+i);
   // }
    for(int i=0;i<5;i++){
        printf("%c  loc  %x\n",a[i],&a[i]);
    }
   // for(int i=0;i<5;i++){
   //     printf("%c\n",c[i]);
   // }
    //for(int i=0;i<10;i++){
     //   printf("%c\n",e[i]);
    //}

    printf("---------------\n");
    for(int i=0;i<10;i++){
        printf("%c loc  %x\n",b[i],&b[i]);
    }
     printf("---------------\n");
    for(int i=0;i<10;i++){
            printf("%c loc  %x\n",d[i],&d[i]);
    }
    return 0;
}

输出结果:

A  loc  402000
B  loc  402001
C  loc  402002
D  loc  402003
E  loc  402004
---------------
0 loc  402005
1 loc  402006
2 loc  402007
3 loc  402008
4 loc  402009
5 loc  40200a
6 loc  40200b
7 loc  40200c
8 loc  40200d
9 loc  40200e
---------------
a loc  40200f
b loc  402010
c loc  402011
d loc  402012
e loc  402013
f loc  402014
g loc  402015
h loc  402016
i loc  402017
j loc  402018
--------strcpy-------
0  loc  402000
1  loc  402001
2  loc  402002
3  loc  402003
4  loc  402004
---------------
5 loc  402005
6 loc  402006
7 loc  402007
8 loc  402008
9 loc  402009
a loc  40200a
b loc  40200b
c loc  40200c
d loc  40200d
e loc  40200e
---------------
f loc  40200f
g loc  402010
h loc  402011
i loc  402012
j loc  402013
! loc  402014
@ loc  402015
# loc  402016
$ loc  402017
% loc  402018

Process returned 0 (0x0)   execution time : 0.730 s
Press any key to continue.

可以看到,它们这几个数组的区域是相邻的,并且调用strcpy()函数用b对a赋值,可以看到会覆盖在和a相邻的数组。
strcpy()函数使用的是‘\0’进行结束判断,一般的实现为

char *strcpy(char *strDest, const char *strSrc)
{
    if ( strDest == NULL || strSrc == NULL)
        return NULL ;
    if ( strDest == strSrc)
        return strDest ;
    char *tempptr = strDest ;
    while( (*strDest++ = *strSrc++) != ‘\0’);
        return tempptr ;
}

所以在没有’\0’符号的前提下会一直往下赋值,直到遇到内存里的某个’\0’(这个字符在内存里非常常见)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值