2013-05-08 115 views
0

這是正確的方法來分配堆棧和堆上的指針指針?如果不是,那麼做一個正確的方法是什麼?如何將指針分配給棧上的指針以及堆上的指針?

int a=7; 
int* mrPointer=&a; 
*mrPointer; 

int** iptr; // iptr is on stack 
*iptr=mrPointer; //not OK 
int** iptr_h = new int*(); // iptr_h is on heap 
*iptr_h=mrPointer; 

由於墊的答案,現在我知道,這是把它放在棧正確的方法:

int** iptr; // iptr is on stack 
iptr=&mrPointer; 

,這在堆上:

int** iptr_h = new int*(); // iptr_h is on heap 
*iptr_h=mrPointer; 
+4

在點'* IPTR = mrPointer;','iptr'是未初始化的,因此解引用它是未定義的行爲。 – 2013-05-08 22:11:16

+3

是什麼讓你認爲有一種正確的方式來分配一個指針指向C++中的指針?你應該問正確的方式來完成某件事情(而這可能不是正確的做法),而不是用正確的方式來做到這一點。 – 2013-05-08 22:12:02

+1

是的,我確實認爲這是一個「XY問題」 - 你認爲Y是實現X的解決方案,所以你問Y怎麼做。最好問一問「我如何實現X」。它可能不是一個雙指針... – 2013-05-08 22:16:53

回答

4

如果你想要一個指向最終指向a變量的指針,那麼你就是這麼做的。

int a=7; 
int* mrPointer=&a; 
*mrPointer; 

int** iptr; // iptr is on stack 
iptr=&mrPointer; 

編輯:澄清,在上面的代碼我改變*iptr = mrPointer;iptr = &mrPointer;

這確實會通過堆確定一個指向相同位置的指針。

int** iptr_h = new int*(); // iptr_h is on heap 
*iptr_h=mrPointer; 

編輯解釋基於評論:

人們還可以看到有必要做這樣的事情:

int* mrsPointer; 
int** iptr = &mrsPointer; 
*iptr = mrPointer; 
+0

這是它,謝謝,我省略了我不能做的事實* iptr,因爲它是未初始化的,但如果它是* iptr = mrPointer在那裏是正確的,對吧? – 4pie0 2013-05-08 22:24:10

+0

@Mats:你把一個指向int的指針放在堆上。我覺得他想把一個指向int的指針放在堆上。 'int *** iptr_h = new int **(&mrPointer);' – 2013-05-08 22:25:25

+0

請參閱編輯[填充] – 2013-05-08 22:26:24

1

當你使用mallocnew爲對象分配空間,它將始終在堆上結束。您可以使用alloca進行堆棧分配,但這種方式明顯更先進,不推薦使用。

+0

這並沒有回答這個問題,並且使用'malloc'避免了C++的使用。 – paddy 2013-05-08 22:18:18

+0

我回答'如何分配堆棧/堆'。我包括'malloc'是完整的,這是不是不相干,因爲許多C++項目接口與C. – 2013-05-08 22:22:50

+0

是的,我改變了問題後反映意見/建議其他參與者 – 4pie0 2013-05-08 22:46:19