如果这是一个错误的问题,我很抱歉。我在读Bjarne Stroustrup的书时发现了这种复制字符串的方法。我写了一个类似的代码来复制数组。
int arr1[5] = {1,2,3,4,5,};
int arr2[5] = {9,10,11,12,13};
int *a = arr1;
int *b = arr2;
// I deduce the original example (C++ book) was with strings, and it terminates because of
while (*a++ = *b++) ;
我的问题是,这个代码正确吗?或者是未定义的行为,因为我没有检查数组的大小?如果它确实是正确的,那么while
中的条件到底在什么时候为假?
编辑:对。我已经在其他地址(超出数组的大小)上打印了值,并且这些值正在被复制,直到b
在内存中指向某个0。
while (*a++ = *b++) ;
的工作原理如下:
-
执行
*a++ = *b++
-
从变量
b
中读取内存地址 -
从该地址读取int
-
从变量
a
中读取内存地址 -
将int写入该地址
-
int是答案
-
为变量
的字节数a
增加int -
为变量
的字节数b
增加int
-
-
如果答案为0,停止循环
- 做什么
-
返回步骤1
你可以看到它一直在复制,直到它最后复制的是0
由于数组arr2
中没有0,它继续读取arr2
结束后的内存地址,并在arr1
结束后写入内存地址,直到它碰巧找到0。这是未定义行为。