更多的LValue错误

时间:2011-03-23 22:44:32

标签: c++ arrays pointers indexing lvalue

以下是三重嵌套索引方案。我指向一个指针数组的指针在注释行上被取消引用...理论上这应该给我一个指针。我从中减去一个然后引用它并将其重新分配给我指向指针数组的指针。但该行给操作数“&”提供左值误差。

让我非常清楚。我想知道为什么在这里发生错误并获得一个方法,用于在指向我的帧双指针的指针数组中分配前一个元素的地址。

我只会接受满足这两个标准的完整解决方案......

#include <iostream>

typedef struct frame_s {
  double ** TestArrayPointer;
} frame_t;

main () {

  double * TestArray;
  double ** TestPointerArray;
  TestArray = new double [100];

  TestPointerArray = new double * [100];

  for (unsigned int Counter = 0; Counter<100; Counter++)
  {
     TestArray[Counter]=Counter;
     TestPointerArray[Counter]=&(TestArray[Counter]);
  }

  frame_t Frames[10];
  for (unsigned int Counter = 0; Counter<10; Counter++)
    Frames[Counter].TestArrayPointer = &(TestPointerArray[Counter*10]);

  //Move pointer to point at array position one back.
  Frames[2].TestArrayPointer=
      &(*(Frames[2].TestArrayPointer)-1); //error! here <--

  //OUTPUT Values...
  for (unsigned int Counter = 0; Counter<100; Counter++)
    std::cout << "P: " << TestPointerArray[Counter] << " V: " 
          << *(TestPointerArray[Counter]) << std::endl;

}

3 个答案:

答案 0 :(得分:1)

Frames[2].TestArrayPointer=
  &(*(Frames[2].TestArrayPointer)-1);

这里解除引用然后取回地址都是不必要的。你可以直接做 -

Frames[2].TestArrayPointer = (Frames[2].TestArrayPointer)-1) ;

但这有潜在的问题。

  • 如果索引是0怎么办?运行时错误。
  • 如果索引是最后一个索引怎么办?内存泄漏。

答案 1 :(得分:1)

您收到错误是因为在-1之后应用了*。你不能得到减法运算符结果的地址 - 比如 rvalue ,而不是左值(左值表示实际对象 - 右值只是短暂的价值)。

最初,Frames[2].TestArrayPointer指向double *指向的数组中的第三个TestPointerArray。据推测,您希望将其更改为指向该数组中的第二个double *。如果是这样,您只需将该行更改为:

Frames[2].TestArrayPointer = Frames[2].TestArrayPointer - 1;

答案 2 :(得分:0)

Frames[2].TestArrayPointer的类型为double**

*(Frames[2].TestArrayPointer)的类型为double*

所以*(Frames[2].TestArrayPointer) - 1double*类型的临时版。临时是一个右值 - 你不能拿它的地址。

我认为你想要的是:

&(*((Frames[2].TestArrayPointer)-1))

也是double*,但它是Frames[2].TestArrayPointer之前的那个而不是临时的。

如果我们摆脱'取消'运算符和冗余的parens:

Frames[2].TestArrayPointer - 1