【发布时间】:2022-01-03 23:11:45
【问题描述】:
这是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);
}
【问题讨论】:
-
请注意,对于几乎所有情况,小于
int的任何类型的值都将为promoted 到int。此促销(例如src[i] == (char)c)也将进行签名扩展。在将char值与实际int值进行比较时,这可能会导致问题。 -
在符号幅度系统上使用有符号字符会混淆负零和正零。
-
它们可能相同也可能不同,但使用
signed char的ft_memchr版本可能会有所不同。 -
感谢您的回答,但您能否提供一个示例,说明使用 char 会导致我们出现问题?