定义一个字符数组,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位。