【问题标题】:Adding pointers to chars添加指向字符的指针
【发布时间】:2015-05-26 14:48:59
【问题描述】:

我怀疑何时出于可移植性的原因添加指针正在对实现进行基本假设,但有人可以解释为什么在 MinGW GCC 下我无法执行以下操作,因为以下错误

“二进制+的无效操作数(有char *char *)”

char *cbase;
char *ep;
char *tbase;
tbase = ep + tbase;

然而,如果我稍微操纵一下代码,我就可以侥幸逃脱

char *cbase;
char *ep;
int temp;

temp = cbase;
tbase = ep + temp;

我知道我对指针实现做了一些假设,但我的观点是为什么编译器不能为我解决它?

【问题讨论】:

    标签: c pointers mingw addition


    【解决方案1】:

    TL;DR - 你不能添加两个指针。

    指针是内存地址。想一想,即使你会被允许添加两个指针,结果有什么意义呢?它会产生大部分一个无效值,不是吗?

    OTOH,您可以将int 添加到指针。这就像通过移动那么多元素来生成一个地址。

    此外,根据C11 标准,第 §6.5.6 章,加法运算符强调我的

    对于加法,两个操作数都应具有算术类型,或者一个操作数应是指向完整对象类型的指针,而另一个应具有整数类型。 (递增是 相当于加了1。)

    【讨论】:

    • 谢谢。我正在移植一个旧的 Small C 应用程序,因此标准似乎自 80 年代以来已经发生了一些变化。可以说,我通过使用和 int 来保存地址来实现我想要的 - 但我现在了解标准。
    • 是的,您关于代码无效性质的观点是正确的。由于小型 c 编译器的限制,原作者使用指针作为无符号整数。
    • @Alex 不客气。 :-) 顺便说一句,您可以考虑 accepting 一个对您有帮助的答案。
    【解决方案2】:

    添加两个指针很可能会生成无效指针,因此不允许这样做,但是向指针添加整数是完全有效的,它将增加指针,即生成的指针很可能是有效的,除非你添加使其指向最初指向的内存块之外的值。

    你不能添加指针,但你可以计算指针的差异,它们就像距离一样

    char *source = "Some text for a test";
    char *head = strstr(source, "text");
    char *tail = strstr(source, "for");
    size_t length = tail - head - 1;
    

    会给你text的长度,所以你可以计算指针差异。

    【讨论】:

    • 感谢 iharob - 这很聪明。我可以使用它,它会解决我的问题。
    • @Alan 甚至还有一个用于指针差异的特殊类型ptrdiff_t
    • 除非我添加库函数,因为我需要编译编译器,否则我不能过多地偏离小型 C 语言,但我想保持接近标准,因此移植到首先是 MinGW GCC。
    • 为此,对于像 Linux 这样的程序员来说,您可以在更好的环境中工作,将 gcc-std=c11 或任何您想坚持的标准一起使用到。
    • 我没有意识到这一点。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多