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

Posted

技术标签:

【中文标题】错误:赋值从没有强制转换的指针生成整数 [-Werror] str1 = (unsigned char*)s1【英文标题】:error: assignment makes integer from pointer without a cast [-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);

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

【问题讨论】:

【参考方案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 但正如你在较早的帖子中看到的那样,我复制和粘贴可能会更慢......

以上是关于错误:赋值从没有强制转换的指针生成整数 [-Werror] str1 = (unsigned char*)s1的主要内容,如果未能解决你的问题,请参考以下文章

如何解决错误“赋值从没有强制转换的指针中生成整数”?

从 'void *' 对 'int' 的赋值使指针从没有强制转换的整数

赋值使指针从整数而不进行强制转换

strcpy 从整数生成指针而不进行强制转换

C指针和数组:[警告]赋值使指针从整数而不进行强制转换[关闭]

警告:赋值从整数中生成没有强制转换的指针[-Wint-conversion]