2015-01-13 97 views
1

根據我對C++的基本知識,我假設下面的代碼會有運行時錯誤。由於編譯器沒有爲y指針分配任何空間,因此應在將值指定給y指針之前添加y = new int;爲指針賦值無新

我錯了嗎或者編譯器有隱式分配空間給y指針嗎? (I編譯我與開發 - C++代碼4.9.9.2。)

#include <cstdlib> 
#include <iostream> 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int* x; 
    int* y;    
    x = new int;   
    *x = 42;    
    cout << *x << "\n"; 
    *y = 13;    
    cout << *y << "\n"; 
} 
+3

這是未定義的行爲。代碼仍然是越野車。 – juanchopanza

+0

它當然沒有。 –

+0

它可能是未定義的行爲,只是沒有顯示錯誤。 – Codor

回答

1

4.1節規定:

一個 非功能,非陣列類型T的左值(3.10)可以是 轉換爲右值。如果T是 不完整類型, 需要此轉換的程序是 不合格。如果向其中 左值是指該對象不是 類型T的對象,而不是源自T類型 的目的,或如果對象是 未初始化,即 必要這種轉換具有 的程序未定義的行爲。如果T是一個 非類類型,右值 的類型是T 的CV-不合格的版本,否則,右值的類型是 T.

未定義意味着任何事情都有可能發生 - 有是沒有保證的。

從維基Making pointers safer

它沒有分配給它的任何地址的指針被稱爲野指針。任何嘗試使用這種未初始化的指針都可能導致意外行爲,因爲初始值不是有效地址,或者因爲使用它可能會損壞程序的其他部分。結果通常是分段錯誤,存儲違規或通配分支(如果用作函數指針或分支地址)。

1

我錯了嗎或者編譯器有隱式分配空間給y指針嗎?

它沒有,並且這樣的賦值是未定義行爲。這意味着它可以工作,並且不會造成任何問題很長時間,但突然可能會導致應用程序崩潰。變量y實際上被分配了一些隨機值,並且*y=13;將13分配給一些隨機存儲器地址,該隨機存儲器地址可以是某個結構或堆棧的有效存儲器地址。如果你初始化y初始化爲nullptr(或0,NULL)int* y=nullptr;,那麼你應該有應用程序崩潰。