关于指针并使用函数将其初始化为堆的C ++行为到底是什么?

时间:2018-10-15 23:56:44

标签: c++ pointers stack heap

目前在弄清楚为什么该函数不能通过函数完全初始化主指针方面有些麻烦。这是我要执行的操作的示例。

#include <iostream>

void stuff(int * p)
{
    p = new int;
}

int main()
{
    int * p;
    stuff(p);
    *p = 1;
    std::cout << *p << std::endl;

    return 0;
}

基本上,我正在尝试使函数使整数指针访问堆。此后,我使用间接运算符和中提琴将其打印出来,我的输出为1。不起作用的是p没有被初始化。我究竟该如何使用函数来初始化指向堆的指针?

3 个答案:

答案 0 :(得分:6)

您的问题是您正在按值传递指针。

因此,函数stuff()获取指针的副本。

void stuff(int * p)  // This is a copy of the value you passed in
{
    p = new int;     // Here you modify the local copy.
}                    // The external value of p is unaffected.

有两种方法可以解决此问题。但是我认为最好的方法是返回该函数的结果值(而不是传递它)。

int* stuff()
{
    return new int;
}

那么用法是

    p = stuff();

但是您可能正在尝试学习如何获取一个函数来更改对象的值。在这种情况下,您需要传递对该对象的引用。

void stuff(int*& p)  // The & means it is a reference to int*
{
    p = new int;
}

用法:

    stuff(p);  // same as your original code.

此处将对p的引用传递到函数中。引用是现有对象的另一个名称。您对函数中的引用所做的任何更改都会反映在函数外部的对象中。

答案 1 :(得分:0)

这似乎是您要执行的操作。 p中的stuff是本地的,因此它将在stuff的末尾销毁。要从p访问main,请将指向它的指针传递到stuff中。因此stuff应该期望有一个指向指针的指针。

#include <iostream>

void stuff(int ** p)
{
    *p = new int;
}

int main()
{
    int * p;
    stuff(&p);
    *p = 1;
    std::cout << *p << std::endl;

    delete p;
    return 0;
}

答案 2 :(得分:-1)

在您的实现函数中,工作人员将一个统一的int *放入其堆栈中,并为一个int分配内存。问题是p变量未在主函数中更新。 有解决此问题的方法,但它并不那么优雅。

#include <iostream> 

void stuff(int** p) {
    *p = new int;
}

int main()
{
    int * p;
    stuff(&p);
    *p = 1;

    std::cout << *p << std::endl;

    return 0;
}

这可以做你想要的。