【问题标题】:increment of void* type-casted as char* fails类型转换为 char* 的 void* 增量失败
【发布时间】:2015-09-11 04:32:42
【问题描述】:

在这样的函数中:

char nextchr (void* p)
{
    ((char*)p)++;

    return *(((char*)p));
}

这应该返回作为参数传递的字符串文字的第二个字符 p 根本无法做到这一点。

为什么会这样?


解决方案总结:

@MM: ++ 需要一个左值(左手值)才能应用,而类型转换的结果不是这样。

@OP 更新: 一些编译器(通常 /old C89/ /compilers/ 像我的)可能允许 ((char*)source)++; / 只要它不作为参数传递给函数 / 即使它是非法的并且被证明是非法的C 标准。

【问题讨论】:

    标签: c pointers void c89 pointer-arithmetic


    【解决方案1】:

    ++ 需要一个左值。您的代码可能是:

    char *c = p;
    ++c;
    return *c;
    

    虽然写return ((char *)p)[1];会简单很多

    【讨论】:

    • 如果我想让它工作,我肯定需要将它传递给char* 吗?为什么带有类型转换的版本不起作用?我知道我做得对..
    • @Malina 抱歉,我不确定你在问什么。我的代码确实实现了“返回作为参数 p 传递的字符串文字的第二个字符”。您的版本不起作用,因为++ 只能应用于左值,并且强制转换的结果不是左值。
    • 但没有解释为什么我的实现不起作用。不过,感谢您的解决方案,它只是解决了关于同一问题的新问题..
    • @Malina 我已经解释了两次为什么你的不起作用。
    • @Malina 抱歉,应该是 (*(char **)&p)++;++*(char **)&p;。请注意,这在技术上也是未定义的行为(违反了称为严格别名规则的东西),因此仅出于教学目的尝试,而不是在实际代码中尝试。在实际代码中编写看起来最简单且可行的代码:)
    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多