2011-02-18 68 views
2

我有一個關於C/C++處理盲目遞增指針的行爲的查詢。C++增加一個指針到未知的內存區域

所以,我有一個指針爲int作爲參數傳遞給函數

func(int* thePointer) {...

和我有一個功能

while(*thePointer) { 
    ++thePointer; 
} 

我明白,只要有內環路是int在超出此指針的內存中循環將繼續,但如果內存屬於另一種內存類型的一部分呢?假設你增加到double的前4個字節。在這種情況下,int仍然會有一個值/會繼續循環嗎?

聲明:我知道這是非常可能的不良做法。這是一個純粹的學術問題。

+8

惡魔會飛出你的鼻子。 – 2011-02-18 02:40:10

+1

盲目增加一個指針是一種非常非常可能的不良做法......說出來大聲,然後閱讀兩遍:http://www.cplusplus.com/doc/tutorial/pointers/,你會感覺更好早上。 – AJG85 2011-02-18 03:11:04

回答

6

內存中沒有這樣的東西,如int。內存只是內存:佔位符的字節。

因此,如果您不斷增加指向int的指針,您將指向內存中接下來的四個字節,就是這樣。如果您嘗試通過指向整數的指針來使用該部分內存,則可能將其內容看作是int

最終,您將指向未分配給您的進程的內存區域,並且程序將以分段錯誤退出。

2

但如果內存屬於另一種內存類型的一部分呢?假設你增加到雙精度的前4個字節。在這種情況下,int仍然會有一個值/會繼續循環嗎?

編譯器不關心那裏有什麼類型的內存。你可以增加到你選擇的任何類型的內存,它會很好。

只有當您嘗試訪問那個內存位置時纔會有問題。如果你試圖在指針位置設置一個值,但它不是分配給你的進程的內存,它會崩潰。

只要該位置的內存屬於您(即:您的程序分配了它),您就可以對其進行設置。話雖如此,如果內存位置不是你被視爲整數值的東西,那麼你很可能會破壞其他對象的狀態,最終會導致不好的事情發生。

+2

-1:不正確。增加超過一個對象的末尾(並訪問內存讀/寫)導致UB。如果對象是一個int的地址,那麼任何增量都會超出。如果地址指向一個數組,然後移動到數組的最後。 – 2011-02-18 02:54:11

+1

實際上,在數組之外的下一個元素上指向(不訪問)是有效的。實際上,這正是`vector <>`的`end()`迭代器正在做的事情。 – Keith 2011-02-18 03:10:21

0

如果你不斷增加,最終你會得到一個SIGSEGV或Windows道德等價物。但是,在你到達那裏之前,你很可能會在虛擬機中進行一次庫克之旅。其他變量,廢棄的三明治包裝紙,無論如何。

這樣的循環不僅僅是「不好的做法」,它們是利用的主要來源。

0

您上面的代碼與內存中有多少個int無關。您的代碼會一直髮現,直到找到等於零的整數。

是的,這是非常糟糕的做法。結果是不確定的。你很可能會遇到不屬於預期數組的部分。而且你很有可能進入內存導致處理器故障。

1

我加入大家。即使有學術目的,這樣做也是爲魔鬼打開了大門。無論內存中的內容如何,​​指針都會每次提前int的大小。訪問時你會得到垃圾。

1

如果訪問內存(讀取或寫入),移動指針是危險的。

將指針移到當前對象的末尾並取消引用該對象是未定義的行爲。

單一對象:

int x; 
int* xp = &x; 

xp++; // Now pointing past the object. 
int y = *xp; // Undefined behavior. 

陣:

int x[10]; 
int xp = x; 

while(*xp) 
{ ++xp; // Works fine the first 9 times. 
}   // After that it is UB to access the memory pointed at by xp 

注:循環

while(*xp) // This continues while the memory pointed at 
      // is not zero. As soon as a zero is found in memory 
      // the loop exits. 
4

ISO 14882,第5.7節:

$ 4對於這些運算符而言,指向非數組對象的指針 的行爲與指向長度爲1的數組的第一個 元素的指針相同,該對象的類型爲元素 類型。

$ 5當具有 積分類型的表達式被添加到或從 指針中減去,結果 具有指針操作數的類型。 如果指針操作數指向數組對象的 元件,並且 陣列足夠大,結果 指向一個元件從 原始元件偏移,使得所述 的下標的 差得到和原始數組元素 等於積分表達式。換言之,如果表達式P 指向數組 對象的第i個元素,則表達式(P)+ N (等同地,N +(P))和(P)N(其中N + )指向,分別爲 ,這個數組對象的第i + n個和第i個 元素,提供 它們存在。此外,如果 公式P指向數組對象的最後 元件,所述 表達(P)1點中的一個過去的數組對象的 最後一個元素,和 如果表達式Q點的一個過去 最後數組對象的元素, 表達式(Q)1指向數組對象的最後一個 元素。如果兩個 指針操作數和結果 指向相同的陣列 對象的元素,或一個過去的最後一個元素的數組對象 ,評價 不得產生溢出; 否則,行爲是不確定的。