C++面试功能

C++ interview function

本文关键字:功能 面试 C++      更新时间:2023-10-16

可能的重复项:
"while(*s++ = *t++("如何工作?

我在一次采访中有以下问题。有人可以向我解释一下吗?

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,这将安全地管理字符串的内存。

复制字符串,指针t到内存,指向s


operator=将返回分配的值。 t应该指向一个以NULL结尾的字符串,s应该指向内存,内存足够大以存储该字符串。

因此,当被击中时,while循环将停止,这是字符串的末端,由t指向。在此while循环期间,t中的所有字符(不同于(都将复制到s中。


稍微扩展一下,它与:

while( *t != '' ) // while the current char is not NULL
{
    *s = *t; // copy it into s
    ++s; // increment s, to point to the next byte
    ++t; // increment t, to point to the next char, that will be copied
}
*s = *t; // copy the last char of t - the ''
它将以

null 结尾的字符串t复制到 s 中。语义作为strcpy .