wcslen或strlen应该阻止无限循环?

时间:2012-11-22 07:39:20

标签: c++ string string-length

此函数计算字符串的求和和终止空字符之间的字符数。

size_t wcslen(const wchar_t* sz)
{
    size_t l = 0;
    while (*sz++) ++l;
    return l;
}

现在如果没有终止空字符,这个函数应该检测到或不是?他们如何发现?循环是否有限制,它确实不是无限的?

5 个答案:

答案 0 :(得分:2)

此函数在第0个值处停止,如果在sz参数的末尾没有wchar_t且为0,则它​​将在内存的其余部分继续,直到达到0值

答案 1 :(得分:2)

这个功能怎么做?的定义 长度是“直到终止空字符”。一个“更安全” 该函数的版本可能需要额外的最大长度, 这将对应于缓冲区的长度 数据举行。但是使用nul终止字符串是 在C中是通用的,而且大多数时候,如果你称之为 功能,这是因为调用你的功能只给你一个 指针,你不知道缓冲区的实际长度。

实际上,如果输入没有终止nul 你将获得一个缓冲区溢出,读取内存 缓冲区的结尾。这样做,迟早,你会 遇到一个包含0的字节,并考虑到这一点 字符串的结尾,或者你最终会得到一个地址 未映射到您的流程,您将崩溃。

答案 2 :(得分:1)

如果字符串没有空终止符,则行为未定义。你不知道你会得到什么。

答案 3 :(得分:1)

嗯,合同是你提供一个以NULL结尾的字符串。如果不这样做,所有的赌注都会关闭,并且函数的行为是未定义的。

答案 4 :(得分:1)

如果没有空终止符(虽然我很难想象所有内存空间都充满了没有任何零的垃圾),那么最终sz会溢出,之后你会尝试取消引用NULL来获取你例外。