这是memchr函数的简单克隆;问题是它既可以与char一起使用,也可以与unsigned char一起使用。
我的问题是为什么这个人说应该是unsigned char
void *ft_memchr(const void *s, int c, size_t n)
{
size_t i;
unsigned char *src;
src = (unsigned char *)s;
i = 0;
while (i < n)
{
if (src[i] == (unsigned char)c)
return (src + i);
i++;
}
return (0);
}这段代码和这段代码有什么区别:
void *ft_memchr(const void *s, int c, size_t n)
{
size_t i;
char *src;
src = (char *)s;
i = 0;
while (i < n)
{
if (src[i] == (char)c)
return (src + i);
i++;
}
return (0);
}发布于 2021-11-26 00:29:04
使用unsigned char时,该行为完全由C标准定义:
unsigned char对象应使用纯二进制表示。脚注清楚地表明unsigned char的所有位都参与此操作,因此它没有填充位。 2018 6.2.6.1 1和2处理表示任何对象的字节,并允许unsigned char以外的整数类型具有填充位。
出于实际目的,现代C实现在很大程度上消除了char和signed char类型的缺点。但是,在理论上,它们可以具有填充比特(并且作为char访问的存储器中的所有比特可能对其值没有贡献,因此将相同的char值写入另一个存储器位置可能不会再现所有比特),并且它们可以具有表示相同值的多个表示(比特模式)(两个表示0,一个具有正符号比特,一个具有负符号比特)。(整数类型通常也可以有陷阱表示,但C 2018 6.2.6.1 5不允许这些表示对字符类型产生影响。)C 2018 6.2.6.2 3表示,当存储在对象中时,不一定保留“负零”;它可能会成为“正常零”。
因此,从理论上讲,当src[i]是char时,它的值可能等于c,即使src[i]的内存中的位与c的位不同,因此memchr例程将返回错误的结果。
您不太可能在实践中遇到这样的C实现,但最终的结果是,C标准使用unsigned char而不是char来保证行为。
https://stackoverflow.com/questions/70115117
复制相似问题