2017-08-03 66 views
1

我發現在嵌入代碼負索引訪問我調試:我可以保證使用負移位訪問指針嗎?

for (int i = len; i > 0; i--) 
{ 
    data[i - 1] = data[i - 2]; // negative access when i == 1 
} 

我讀this關於類似的情況,但在OP arr[-2]保證是因爲arr點的先前中間OK分配數組。就我而言,data是一個類中的指針由構造與初始化:

public: 
    constructor_name(): ... data(new T_a[size]), ... 

和指針data在類中的第一個成員:

template <class T_a, class T_b, int size> 
class T_c 
{ 
private: 
    T_a   *data; 
    T_b   *...; 
    int    ...; 
    int    ...; 
    int    ...; 

public: 
    constructor_name(): ... data(new T_a[size]), ... 

現在,有一個否定索引訪問是故意的並且有意義的可能性?有沒有一種方法編寫程序員能夠確保data[-1]將訪問特定數據,使用#pragma pack()或其他任何方法?

看到*data是班上第一個讓我覺得這是一個bug的成員,但我不確定。如果確實是一個錯誤 - 是UB

+4

確實是[未定義的行爲](https:// en。wikipedia.org/wiki/Undefined_behavior)所以你沒有任何保證 –

+0

@BasileStarynkevitch如果'data'位於課堂上其他地方 - 它會有什麼區別嗎? – CIsForCookies

+0

我不這麼認爲。關於UB的C++標準非常強大。 –

回答

4

您在詢問擔保(一個很強的詞)。而你的代碼有undefined behavior(因爲你正在訪問你的對象之外的一些數據),這意味着你不能有任何保證。任意壞事could發生,即使在實踐中他們通常不會(特別是當data指向一個標量類型,如指針)。

我建議用for (int i = len; i > 1; i--)代替for (int i = len; i > 0; i--)至少使代碼更具可讀性和更符合標準。

如果出於某種奇怪的原因data[-1]訪問權限對以前的程序員有意義,他應該至少已經評論過。我猜如果他不這樣做,那簡直是一個錯誤。

1

這取決於您正在使用的嵌入式芯片。

首先,要注意的重要部分是生活在堆中的data。所以通常情況下(在臺式電腦中),你不能假定這個data就在你控制的另一條信息的旁邊。

但是,正如我們在這裏所談論的嵌入式系統一樣,它們中的一些具有用於堆棧和堆的單個連續內存空間,並且開始從該內存空間的一側填充堆,並從另一側開始填充堆,直到它們在中心見面,程序崩潰。

不管怎樣,在這種情況下,你的代碼的程序員會如此謹慎,他知道這是下一個heap分配會發生,從而保證該變量人住data,但實際上我覺得這是不太可能。儘管如此,他會利用undefined behaviour,因爲它是一個"memory access outside of array bounds",我認爲這不僅是一個糟糕的編程習慣,而且是一個錯誤。

找到了堆堆棧模型如何在特定芯片here中工作的圖片。

+0

它仍然是[未定義的行爲](https://en.wikipedia.org/wiki/Undefined_behavior) –

+0

同意,這是未定義的行爲。 – MondKin

+0

所以我會在你的回答中提到UB。 OP詢問「保證」 –