对于这种奇怪的行为,我需要一些建议——让我们使用这段代码:
int ** p;
编译没有任何问题:
p++;
但是这个:
((int**)p)++;
给我这个错误消息:“错误:需要左值作为增量操作数”
。
我正在将 p
转换为它已经存在的类型,没有任何变化,那么问题是什么?这是我遇到的问题的简化版本,当我试图编译一个旧的
gdb
的版本。所以我想,这行得通并且发生了一些变化。知道第二个例子有什么问题吗?
最佳答案
旧版本的 gcc 支持一种叫做“左值转换”的东西——如果你转换一些左值,结果就是一个左值,并且可以这样处理。它的主要用途是允许您将指针递增一个对应于不同大小的量:
int *p;
++(char *)p; /* increment p by one byte, resulting in an unaligned pointer */
这个扩展在 gcc v3.0 前后被弃用,并在 gcc v4.0 中被移除
要在较新版本的 gcc 中执行相同的操作,您需要执行加法和赋值(而不是递增),将指针转换到加法的类型并返回赋值:
p = (int *)((char *)p + 1);
请注意,在此之后尝试取消引用指针是未定义的行为,因此不要指望它做任何有用的事情。
关于c - 为什么 this 的结果不是左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21386485/