Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++关于指针和使用函数初始化它们到堆的行为到底是什么?_C++_Pointers_Heap Memory_Stack Memory - Fatal编程技术网

C++关于指针和使用函数初始化它们到堆的行为到底是什么?

C++关于指针和使用函数初始化它们到堆的行为到底是什么?,c++,pointers,heap-memory,stack-memory,C++,Pointers,Heap Memory,Stack Memory,目前在弄清楚为什么这个函数不能通过函数完全初始化main中的指针时遇到了一些问题。这是一个我正在尝试做的例子 #include <iostream> void stuff(int * p) { p = new int; } int main() { int * p; stuff(p); *p = 1; std::cout << *p << std::endl; return 0; } 基本上,我试图使它成

目前在弄清楚为什么这个函数不能通过函数完全初始化main中的指针时遇到了一些问题。这是一个我正在尝试做的例子

#include <iostream>

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

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

    return 0;
}

基本上,我试图使它成为一个函数,使整数指针访问堆。在那之后,我用间接操作符和viola打印出来,我有一个输出。不起作用的是p没有被初始化。如何确切地使用函数初始化指向堆的指针

这似乎就是你想要做的。材料中的p是本地的,所以在材料的末尾会被销毁。要从main访问p,需要将指向它的指针传递到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;
}

在您的实现函数中,staff将一个统一的int*放入堆栈,并为int分配内存。问题是p变量在main函数中没有更新。 有办法解决这个问题,但它不是那么优雅

#include <iostream> 

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

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

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

    return 0;
}

这可以满足您的需要。

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

所以函数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的引用传递到函数中。引用是现有对象的另一个名称。对函数中的引用所做的任何更改都会反映在函数外部的对象中。

stuff中的指针p是stuff的局部变量-一旦函数退出,它就会被丢弃。你的C++教科书应该告诉你所有这些。分配给函数的参数在函数之外没有任何效果。指针没有什么特别之处。你希望stuff0做什么?迂腐的旁注:C++的行为是用抽象术语动态内存定义的。堆只是一个非常常见的实现,可能与首选方案重复:void stuffint*&p{p=new int;},然后是stuffp;void stuffint**p是您在c中所做的。虽然它仍然在C++中工作,但它更喜欢使用引用。C++具有本地引用,没有理由使用通过指针作为黑客来模拟通过引用的另一个答案,更喜欢引用指针:空隙填充**和P {P=new int;}更少的错误空间,更少的代码修改。实际上,Askers代码中添加了一个字符。就这样。避免像那样弄乱指针和引用是很好的。您的问题的简洁解决方案可以是这样的:int*stuff{returnnewint;}