此函数计算字符串请求和终止空字符之间的字符数。
size_t wcslen(const wchar_t* sz)
{
size_t l = 0;
while (*sz++) ++l;
return l;
}
现在,如果没有终止空字符,这个函数应该检测到还是没有?他们如何检测?循环是否有限制,并且确实不是无限的?
此函数计算字符串请求和终止空字符之间的字符数。
size_t wcslen(const wchar_t* sz)
{
size_t l = 0;
while (*sz++) ++l;
return l;
}
现在,如果没有终止空字符,这个函数应该检测到还是没有?他们如何检测?循环是否有限制,并且确实不是无限的?
该函数在第一个 0 值处停止,如果 sz 参数末尾没有带 0 的 wchar_t,它将继续在内存的其余部分中,直到达到 0 值
以及如何做到这一点的功能?长度的定义是“直到终止的 nul 字符”。该函数的“更安全”版本可能需要额外的最大长度,这将对应于保存数据的缓冲区的长度。但是在 C 中使用 nul 终止的字符串是通用的,而且大多数时候,如果你调用这个函数,那是因为调用你的函数只给了你一个指针,你不知道缓冲区的实际长度.
在实践中,如果输入没有终止 nul 字符,您将获得缓冲区溢出,读取超出缓冲区末尾的内存。这样做时,迟早你会遇到一个包含 0 的字节,并认为这是你的字符串的结尾,或者你最终会得到一个没有映射到你的进程的地址,并且你会崩溃。
如果字符串没有空终止符,则行为未定义。你不能说你会得到什么。
好吧,合同是你提供一个以 NUL 结尾的字符串。如果你不这样做,所有的赌注都会被取消,并且函数的行为是未定义的。
如果没有空终止符(尽管我无法想象内存空间都充满了没有任何零的垃圾),那么最终sz
会溢出,之后您将尝试取消对 NULL 的引用,这会给您带来异常。