2012-04-18 50 views
0

我有一個指向空的指針,我想爲它賦值。但如果我尊重它,我會得到一個錯誤。我試過這個:如何將值賦給指向NULL的指針

*nullPointer=value; 

但就像我說的,我得到一個錯誤。我怎樣才能做到這一點?。我不能這樣做

nullPointer=&value 

因爲後面的值(它是一個對象)被刪除,並且nullPointer會指向無效的內存。

+0

你的意思是*指針* NULL? – 2012-04-18 18:30:11

+1

指針不能指向null。它可以是一個空指針,這意味着它不指向任何東西。只要名稱可見,聲明的對象就不能被刪除;它只在其範圍的最後停止存在。 '&value'是執行'nullPointer = &value;'時的有效地址。它可能會在稍後失效。 – 2012-04-18 18:32:06

+1

閱讀[this](http://www.perlmonks.org/?node_id=542341),然後告訴我們你想要完成什麼。並閱讀[comp.lang.c FAQ](http://c-faq.com/)的第4節和第5節; C指針與C++指針基本相同。 – 2012-04-18 18:36:33

回答

2

指針指內存(RAM)中的位置。當你有一個null pointer它指向空,這意味着它沒有指向內存中的位置。只要指針爲空,它就不能用於存儲任何信息,因爲沒有內存將其備份。

要使用空指針,您必須先分配內存,然後讓指針指向新分配的內存。

*int p = null;  
*p = 10; //this won't work as there is no memory backing up this pointer 
p = new int; 
*p = 10; 
+1

*「你不能給一個指向null的指針賦值。」* - 不是最好的措辭。指針不能指向空;它可以*爲* null(空指針,NULL),正如你所說,它意味着它不指向任何東西。你當然可以賦值給一個空指針;你只是不能爲它指向的對象賦值。 – 2012-04-18 18:38:20

7

一個指針必須指向一個有效的對象纔能有意義,並且有責任確保它指向的對象保持有效。

如果它指向的對象位於堆棧上,並且一旦其作用域結束就會失效您應該使用動態內存在堆上分配對象。然而,知道自己在做什麼以及是否需要這些信息的信息太少。

int *ptr = new int; 
*ptr = value; 
... 
... 
delete ptr; 
2

這聽起來像你想引用一個對象,直到/除非對象被刪除,此時它的作用大致是一個空指針再次指向 - 也就是說,你至少可以檢測到它不不再指向任何事情。

如果是這種情況,您可能需要一個weak_ptr(在C++ 11,TR1和Boost中可用)。你可以使用shared_ptr。當一個對象的最後一個shared_ptr被銷燬時,該對象本身也將被銷燬。之後,您可以檢測到weak_ptr不再引用任何內容(Boost documentation等等,其中有更多詳細信息)。

編輯:下面是來自Boost文檔爲weak_ptr一個例子:

shared_ptr<int> p(new int(5)); 
weak_ptr<int> q(p); 

// some time later 

// this will succeed *only* if at least one other reference to the pointee still exists. 
if(shared_ptr<int> r = q.lock()) 
{ 
    // use *r 
} 
+0

如何檢測到已刪除對象的指針無效?即使通過該指針刪除對象,指針也會保持其值。在一些編譯器/平臺上,你仍然可以用指針訪問被刪除的對象,雖然這顯然是未定義的行爲。 – bjhend 2012-04-18 19:11:06

+0

@bjhend:這不是使用原始指針,而是'shared_ptr'和'weak_ptr'。 'shared_ptr'維護指向對象的引用計數,並且只有當引用計數下降到零時才刪除它。你不能直接取消引用'weak_ptr' - 你必須首先將它轉換爲'shared_ptr',但如果指針已經被刪除了,那將失敗。 – 2012-04-18 19:22:07

+0

好吧,我誤解你的第一段作爲關於正常指針的陳述。我現在看到你只表達了智能指針遇到的原始問題的指針要求。 – bjhend 2012-04-18 19:38:46