错误:赋值从没有强制转换的指针生成整数 [-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】:您希望 str1
和 str2
成为指针(匹配演员表),而不是 unsigned char
s:
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' 的赋值使指针从没有强制转换的整数