2015-06-12 49 views
-3

我注意到,如果我在函數中創建一個指針,它不會讓我爲它設置一個值。 例如:爲什麼不能在函數中設置指針

int func() { 
    int* pointer; 
    *pointer = 0 //error I get: "Exception: STATUS_ACCESS_VIOLATION" 
    return *pointer; 
} 

我得到的不會讓你設置一個指針的函數,因爲如果我用一個正常的INT它的工作原理:

int func() { 
    int notAPointer; 
    notAPointer = 0; 
    return notAPointer; 
} 

任何人都可以向我解釋這是爲什麼?

+6

因爲你基本上做的是採取一個比薩餅紙板,剪一張名片從它,然後開車到什麼樣子正巧被潦草地寫上「地址」那塊紙板。然後你試着按門鈴。 – fredoverflow

回答

4

您尚未爲指針指定任何內存。

這意味着取消引用指針(*pointer)會導致未定義的行爲(如您的案例中的崩潰)。你需要解引用之前的指針初始化:(。而事後,delete pointer;不泄漏內存始終delete一切你從new獲得。)

int* pointer = new int; 


另外,指針不必指向動態分配的數據(通過調用new獲取),y因爲當你聲明pointer它指向一個完全任意存儲位置

int func() { 
    int valueOnStack = 42; 
    int* pointer = &valueOnStack; 
    *pointer = 0; 
    return *pointer; 
} 
+0

StackOverflow鼓勵解釋downvotes :)謝謝。 – emlai

+0

我同意天頂,我沒有看到這個答案有什麼問題。 –

0

pointer不指向任何以下int* pointer;

所以取消引用它是未定義的行爲。

如果你寫

int n; 
pointer = &n; 

那麼你取消對它的引用。

Altenatively,您可以從分配內存吧:

pointer = new int; 

但你必須記得打電話delete pointer;否則你會泄漏內存。

2

:您可以同時指向自動(棧)變量了。你不能只寫一些舊的內存。

你需要爲它第一次分配內存:

int* pointer = new int; 
*pointer = 0; 

或者只是:

int* pointer = new int(); 
1

指針pointer未初始化並指向內存中的一個隨機位置,當你把它聲明。它可以指向系統堆棧或全局變量,也可以指向程序的代碼空間或操作系統。當你說*pointer = 0時,程序會簡單地嘗試寫一個0pointer指向的任意位置。

該程序可能會立即爆炸,或者可能會等待半小時然後爆炸,或者它可能巧妙地破壞程序另一部分中的數據,您可能永遠不會意識到它。這可能使這個錯誤非常難以追查。請確保您在解除引用前初始化所有指向有效地址的指針。

-1

此代碼是在函數內部完全有效的:

int *pointer = 0; 

但是,這將是相同的指針設置爲NULL宏。

如果您嘗試設置其他值,編譯器會抱怨沒有從
INT沒有有效轉化爲int *:

int *pointer = 1; // Error 

但是,如果你想一個值賦給指針,按照TartanLlama的回答使用新的和刪除。首先分配內存,然後分配一個值:

int *pointer = new int; 
*pointer = 1; // OK 
// delete when appropriate 
+0

@downvoter,你能解釋代碼中的錯誤嗎? –

相關問題