c - 为什么 this 的结果不是左值?

标签 c casting lvalue rvalue

对于这种奇怪的行为,我需要一些建议——让我们使用这段代码:

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/

相关文章:

c - Journalctl 源中的无效包装函数

c - 在 C 中将 int 转换为 char 时出现段错误

string - Kafka 消息键 - 同时使用 byte[] 和 String

C++ 非常量-常量引用函数重载

c - 根据结构体内部的元素对结构体指针数组进行排序

c - 如何从用户输入中获取数组的每个元素,然后将其传递给 C 中另一个文件中的函数

c - 我需要创建一个循环来找到最年长的学生并打印他的 ID

swift - 将 [NSURL] 转换为 NSUserDefaults 的 [String]?

c++ - std::move 的无限递归

c - `*a =` 和 `= *a` 有什么区别?