后面的strnlen
的实现是否无效?
size_t strnlen(const char *str, size_t maxlen)
{
char *nul = memchr(str, '\0', maxlen);
return nul ? (size_t)(nul - str) : maxlen;
}
我认为
memchr
总是可以查看maxlen
字节,无论这些字节的内容如何。如果没有NUL终止符,那么strnlen
协定仅允许它查看所有maxlen
字节吗?如果是这样,str
的内存大小可能小于maxlen
字节,在这种情况下memchr
可能会尝试读取无效的内存位置。这样对吗? 最佳答案
是的,发布的实现是合规的:除了第一次出现memchr()
之外,不应从str
中读取字节。
C17 7.24.5.1 '\0'
函数
简介
#include <string.h>
void *memchr(const void *s, int c, size_t n);
说明
memchr
函数在memchr
指向的对象的初始c
字符(每个字符都解释为unsigned char
)中定位首次出现n
(转换为unsigned char
)。该实现应表现为好像它顺序读取字符并在找到匹配字符后立即停止。返回
s
函数返回指向所定位字符的指针,如果该字符未出现在对象中,则返回空指针。memchr
可以通过高效的技术来实现,该技术一次测试多个字节,可能会读取超出第一个匹配字节的内容,但前提是这不会引起任何可见的副作用。