关于strcpy函数的思考

定义一个字符数组,char str[ ] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};

执行函数strcpy(str+2, str);

你认为输出(str+2)会是什么结果呢?你可能会认为这不是个问题,就应该是"123456789",但实际的运行结果并不是这样的,我们来看看输出结果:

图片

 

我们再看一下strcpy(str+1, str)和strcpy(str+3, str)的结果

图片

 

图片

看到这样的结果只能说很诡异,我观察后做出以下推想,也不敢肯定对,但根据数学归纳法,既然n是对的,那么n+1也应该对。

话归正题:

我认为strcpy复制并不是一个字节一个字节地拷贝,而是一次取四个字节进行拷贝

以strcpy(str+2, str)为例,把源地址str的字符串“123456789”拷贝到目的地址为str+2的地方,每次取四个字节

,如下所示(括号中为内存原来的内容):

第一次:

1

2

3

4

5

6

7

8

9

1

2

1(3)

2(4)

3(5)

4(6)

7

8

9

第二次:

1

2

1

2

3

4

7

8

9

 

1

2

1

2

3

4

3(7)

4(8)

7(9)

 8

第三次:

1

2

1

2

3

4

3

4

7

8

 

 

1

2

1

2

3

4

3

4

7

8

 7

 8

所以最终结果是

str:121234347878

str+2:1234347878

同样可以分析strcpy(str+1, str),strcpy(str+3, str),结果也与预期的一样。

我觉得一次拷贝四个字节是因为计算机是32位的,这样操作效率是最高的,四个字节刚好32位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值