C++面试函数

标签 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/

相关文章:

c++ - 清除 vector 时,STL vector 内部的 STL vector 是否超出范围?

C++ 如何区分异构集合中的特定对象类型?

c++ - 从函数返回数组时是否需要删除

c++ - 在 strtok 之后比较字符串

c++ - 关于成员函数指针值的 Constexpr - 未定义的行为?

c++ - 显示用户输入的大于 50 的平均数和所有可被 3 整除的数字的乘积

c++ - 将类内部暴露给 future 谓词仿函数的良好设计机制?

c++ - 快速可靠的反射球检测方法

c++释放数组指针的内存

c++ - 旋转 Atan2 CCW CW 连续性