2013-05-08 145 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