gpt4 book ai didi

*(unsigned char *)s1 和 (unsigned char)*s1 之间的 C 区别

转载 作者:行者123 更新时间:2023-12-01 15:00:30 26 4
gpt4 key购买 nike

我有一项任务是重写 libc 中可用的一些流行的 C 函数。

我正在编写 strcmp,当我写完并对它感到满意时,我去检查了 libc 中的那个。

这是我的:

int     ft_strcmp(const char *s1, const char *s2)
{
while (*s1 && *s1 == *s2)
{
s1++;
s2++;
}
return ((unsigned char)*s1 - (unsigned char)*s2);
}

这是 libc ( https://www.opensource.apple.com/source/Libc/Libc-262/ppc/gen/strcmp.c ) 中的那个:

int
strcmp(const char *s1, const char *s2)
{
for ( ; *s1 == *s2; s1++, s2++)
if (*s1 == '\0')
return 0;
return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1); // HERE ! Why *(unsigned char *) :/ ?
}

我不明白为什么 *(unsigned char *)s1 有效,我认为它不会,但它看起来确实有效!

然后我在另一个 libc ( https://sourceware.org/git/?p=glibc.git;a=blob;f=string/strcmp.c;h=a4645638eb685e479b89a5e3912076329cc27773;hb=HEAD ) 中找到了这个实现

int
strcmp (p1, p2)
const char *p1;
const char *p2;
{
const unsigned char *s1 = (const unsigned char *) p1;
const unsigned char *s2 = (const unsigned char *) p2;
unsigned char c1, c2;
do
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2);
return c1 - c2;
}

Whis 也很奇怪,但出于其他原因,这个使用了我认为正确的 (const unsigned char *) p1

最佳答案

你获取一个 char* 并将其取消引用为 char,然后将其转换为 unsigned char

您认为行不通的方法只是先将指针转换为 unsigned char*,然后在取消引用时将其转换为 unsigned char

在这种情况下,因为它只是从 charunsigned char,所以基本上没有区别。

但是,如果原始指针指向 int 或其他内容,您的指针将获得 int 并将其转换为 unsigned char。另一个将获取 int 的第一个字节并将其作为 unsigned char

返回

关于*(unsigned char *)s1 和 (unsigned char)*s1 之间的 C 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20106732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com