【问题标题】:error: assignment makes integer from pointer without a cast [-Werror] str1 = (unsigned char*)s1错误:赋值从没有强制转换的指针生成整数 [-Werror] str1 = (unsigned char*)s1
【发布时间】:2014-11-10 15:56:35
【问题描述】:

我正在尝试重现函数 memcmp,当我尝试编译时出现错误:

错误:赋值从没有强制转换的指针生成整数 [-Werror]
str1 = (unsigned char*)s1

这是我的代码:

int ft_memcmp(const void *s1, const void *s2, size_t n)
{
    unsigned char   str1;
    unsigned char   str2;

    str1 = (unsigned char*)s1;
    str2 = (unsigned char*)s2;
    while (n--)
    {
        if (str1 != str2)
           return (str1 - str2);
        str1++;
        str2++;
    }
    return (0);
}

任何人都可以帮我处理这些演员表吗?我真的不明白为什么它不起作用

【问题讨论】:

    标签: c pointers casting


    【解决方案1】:

    您希望 str1str2 成为指针(匹配演员表),而不是 unsigned chars:

    unsigned char *str1, *str2;
    
    str1 = (unsigned char*)s1;
    str2 = (unsigned char*)s2;
    
    while (n--)
    {
      if (*str1 != *str2)
        return (*str1 - *str2);
    
      str1++;
      str2++;
    }
    

    【讨论】:

    • 我会使用 ++str1 和 ++str2,应该会更快。
    • @IFeelGood 为什么这会更快?我无法想象编译器会将str1++;++str1; 变成甚至略有不同的代码。
    • 后增量通常涉及保留先前值的副本并添加一些额外的代码。预增量只是完成它的工作并且不碍事。我觉得很高兴知道...
    • 最好花 10 或 15 分钟阅读编译器优化,然后问问自己为什么编译器“通常”会在手头的情况下保留旧值。 answer you copied-and-pasted 在某些情况下是相关的,但几乎可以肯定不在这里。
    • 是的,我复制并粘贴了简短(我没有时间重写它),是的,在这种情况下“可能”速度不会改变,但你不能确定编译器做了什么,直到你看不到 ASM 代码,我认为对于程序员来说通常使用 ++something 而不是 something++ 是有好处的,因为它可以更快。但是,如果这让你感到不舒服,你可以继续写 str1++ 而不是 ++str1 但正如你在较早的帖子中看到的那样,我复制和粘贴可能会更慢......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2011-07-04
    相关资源
    最近更新 更多