2014-07-24 119 views
0

下面的代碼正常工作,但如果我嘗試訪問函數fun()中的私有成員變量m_sal,則會導致分段錯誤。訪問導致seg故障的私有成員

任何人都可以解釋是什麼原因?

class Emp 
{ 
    int m_sal; 
public : 
    void fun(char* name) 
    { 
     std::cout<<"Name :"<<name<<std::endl; 
    } 
}; 

int main() 
{ 
    Emp *e = NULL; 
    e->fun("Hi"); 
    return 0; 
} 
+1

因爲你有未定義的行爲。在這兩種情況下。當行爲未定義時,任何(或任何)結果都是可能的。 – user2079303

+0

從空指針調用函數?我想這就是seg故障的原因 –

+0

可能的重複:http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined- BEHA – user2079303

回答

0

首先可能要改變你的方法的簽名讀取

void fun (const char* name) const; 

"Hi"轉換爲char *已被棄用,const正確性highly recommended。您的崩潰是由於人們通過在空指針上調用您的方法而引起的。嘗試

Emp * e = new Emp; 
e->fun("Hi"); 

改爲。

1

通過NULL指針調用方法 - 就像你正在做的那樣 - 是未定義的行爲。所以它可能會崩潰,不會崩潰,做任何事情。

0

當然,它崩潰。

Emp *e = NULL; 

創建這恰好是一個空指針的指針(因爲= NULL,但我相信我們很多人寧願= nullptr),所以沒有分配給它的指向對象的內存。你需要創建一個這個指針指向的對象:

Emp* e = new Emp; 

現在你可以使用它。

崩潰的確切原因是應用程序試圖從非常低的內存地址(指針的值爲0,某些情況下,爲C++對象的正確內存佈局添加一些填充字節,但在這種情況下,它很可能只是想讀取地址0處的內存),在大多數情況下,系統保留使用該系統。

0

在您的代碼中,e是一個指針,而不是一個對象的實際實例。您可以有:

Emp e; 
e.fun("Hi"); 
//No need to clean up stack variable 

OR

Emp *e = new Emp; 
e->fun("Hi"); 
delete e; //don't forget to clean up! 

你有什麼是因爲使用NULL指針調用函數的未定義行爲。