2011-03-23 49 views
0

下面是一個三重嵌套索引方案。我對指針數組的指針在註釋行上被解引用......理論上這應該給我一個指針。我從它減去一個,然後引用它,並將其重新分配給我指向指針數組的指針。但是該行爲操作數「&」提供了一個左值錯誤。更多的差錯錯誤

讓我完全清楚。我想知道爲什麼這裏發生了錯誤,並得到一個方法,用於分配指向我的幀雙指針的指針數組中前一個元素的地址。

我將只接受完整的解決方案,同時滿足這兩個條件....

#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; 

} 
+1

不應該這樣被標記爲'C++',而不是目前的'C'標籤? – pmg 2011-03-23 22:47:05

+0

請提供實際的編譯器錯誤。 – linuxuser27 2011-03-23 22:47:16

+0

錯誤:在一元'無效左值'&' – 2011-03-23 22:47:39

回答

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

這裏既有非關聯化,然後收回該地址是不必要的。你可以直接做 -

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

但是這有一個潛在的問題。

  • 如果指數爲0會怎麼樣?運行時錯誤。
  • 如果索引是最後一個索引會怎樣?內存泄漏。
1

由於在*之後應用了-1,您會收到錯誤消息。你不能把減法運算符的結果的地址 - 這是一個右值,而不是左值(一個左值指定一個實際的對象 - 右值僅僅是一個短暫的值)。

最初,Frames[2].TestArrayPointer指向由TestPointerArray指向的數組中的第三個double *。想必,你想改變它指向該數組中的第二個double *。如果是這樣,你可以簡單地改變該行:

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

Frames[2].TestArrayPointer具有類型double**

*(Frames[2].TestArrayPointer)的類型爲double*

所以*(Frames[2].TestArrayPointer) - 1是臨時用double*類型。臨時是一個右值 - 你不能把它的地址。

我想你想要的是:

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

這也是一個double*,但它是一個先於Frames[2].TestArrayPointer而不是暫時的。

如果我們擺脫「取消」運營商和多餘的括號中:

Frames[2].TestArrayPointer - 1