首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更多LValue错误

更多LValue错误
EN

Stack Overflow用户
提问于 2011-03-24 06:44:32
回答 3查看 133关注 0票数 0

下面是一个三重嵌套索引方案。我指向指针数组的指针在注释行上被取消引用...从理论上讲,这应该给我一个指针。我从其中减去1,然后引用它,并将其重新赋值给指向指针数组的指针。但该行给出了操作数"&“的左值错误。

让我把话说清楚。我既想知道为什么这里会发生错误,又想获得一个方法,用于将指针数组中前一个元素的地址分配给我的帧双指针。

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

代码语言:javascript
复制
#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;

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-24 07:02:21

代码语言:javascript
复制
Frames[2].TestArrayPointer=
  &(*(Frames[2].TestArrayPointer)-1);

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

代码语言:javascript
复制
Frames[2].TestArrayPointer = (Frames[2].TestArrayPointer)-1) ;

但这有一个潜在的问题。

如果索引为0,

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

Stack Overflow用户

发布于 2011-03-24 07:04:18

您会得到错误,因为在*之后应用了-1。你不能接受减法运算符结果的地址--这是一个右值,而不是一个左值(一个左值指定一个实际的对象-一个右值只是一个短暂的值)。

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

代码语言:javascript
复制
Frames[2].TestArrayPointer = Frames[2].TestArrayPointer - 1;
票数 1
EN

Stack Overflow用户

发布于 2011-03-24 07:04:39

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

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

因此,*(Frames[2].TestArrayPointer) - 1double*类型的临时类型。临时值是一个右值--你不能获取它的地址。

我想你想要的是:

代码语言:javascript
复制
&(*((Frames[2].TestArrayPointer)-1))

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

如果我们去掉“取消”运算符和多余的括号:

代码语言:javascript
复制
Frames[2].TestArrayPointer - 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5412601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档