<分区>
Possible Duplicate:
How does “while(*s++ = *t++)” work?
我在面试中遇到了以下问题。有人可以给我解释一下吗?
void question( char *s, char *t)
{
while (*s++ = *t++);
}
标签 c++
<分区>
Possible Duplicate:
How does “while(*s++ = *t++)” work?
我在面试中遇到了以下问题。有人可以给我解释一下吗?
void question( char *s, char *t)
{
while (*s++ = *t++);
}
最佳答案
它在您的程序中引入了一个巨大的安全漏洞。在任何情况下都不要编写或使用这样的代码。
如果我们分解代码,我们会得到:
*t++
读取t
指向的字符,并自增t
;表达式的值是读取的字符。*s++ = expression
将该字符写入s
指向的位置,并递增s
;表达式的值是写入的字符。while (expression);
只要表达式的值不为零就一直循环;在这种情况下,直到我们写入一个值为零的字符。因此该函数不断将字符从 t
复制到 s
直到它到达一个零值字符。没有办法判断 s
是否指向一个足够大的数组来容纳这些,所以通常它会写到数组的末尾之外并导致未定义的行为;从没有不良影响的微妙行为到崩溃,再到恶意代码的执行。
如果您事先知道(上限)将复制多少个字符,则只能调用此函数;如果您知道这一点,那么(通常)有比检查每个数据的值更有效的方法来复制数据。因此,您应该(几乎)永远不要使用此函数或它近似的 C 库函数 (strcpy
)。
这种使用零值字符来终止字符串是 C 中的常见习惯用法;在 C++ 中,通常使用 std::string
类来表示字符串更方便。在那种情况下,等效代码将只是 s = t
,它将安全地管理字符串的内存。
关于C++面试函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12191458/