【问题标题】:Using "new" inside of a function [duplicate]在函数内部使用“新”[重复]
【发布时间】:2016-05-03 19:56:32
【问题描述】:

虽然我知道这不一定是最好的编码方式,但我想在函数内部初始化一个指针。然后,我可以稍后使用它并删除它。它应该看起来像这样:

#include <iostream>

void initializer(double *d_ptr)
{
    d_ptr = new double;
}

int main(int argc, char **argv)
{
    double *my_d;

    initializer(my_d);
    *my_d = 2;
    std::cout << *my_d << std::endl;

    delete my_d;
}

但是,这会导致段错误。为什么?

【问题讨论】:

  • @LogicStuff 我知道基本错误是如何通过引用传递指针(不了解如何通过引用传递指针)但是在搜索如何初始化内部指针时无法找到这些答案的一个功能。我认为基本错误是重复的,但是这个问题不是重复的,因为类似的答案已经表明您知道自己在做什么。这个问题是关于如何弄清楚为什么函数没有正确初始化,即使它编译了。
  • @juanchopanza 见上文?
  • 实际上...我刚刚阅读了 stackoverflow 对重复项的使用。看起来这属于重复的情况,但不应删除该问题,因为该问题是唯一的,如果您遇到此问题,则很难找到链接的答案。听起来对吗? stackoverflow.com/help/duplicates

标签: c++ function pointers initialization


【解决方案1】:

问题出在功能上。它接收double *d_ptr。这意味着d_ptr 是一个指向双精度的指针。但是当你这样做时:

d_ptr = new double;

这将重新分配指针d_ptr 一个新地址,而不会影响传递给函数的外部指针。

我们要做的是为外部指针分配一个新地址。这意味着当我们执行d_ptr = new double; 时,我们希望d_ptr 成为对外部指针的引用。然后,通过为d_ptr 分配一个新地址,我们为外部指针分配一个新地址。函数接收指针的正确方式是:

void initializer(double *&d_ptr)

这意味着函数有一个变量d_ptr,它是对双精度类型指针的引用。一个角色解决一切:

#include <iostream>

void initializer(double *&d_ptr)
{
    d_ptr = new double;
}

int main(int argc, char **argv)
{
    double *my_d;

    initializer(my_d);
    *my_d = 2;
    std::cout << *my_d << std::endl;

    delete my_d;
}

【讨论】:

  • 这对一些简单的事情有很多解释。您的解释与您尝试更改传递给函数的任何参数的值并让更改反映给调用者没有什么不同。你传递一个对该类型的引用,在这种情况下,该类型是一个指针,所以你传递一个对指针的引用。
  • 事后看来很简单,我同意;只是没有远见。我花了一些时间来思考具有地址值的指针。我想通过传递一个指针,它会被复制到新的指针上,我可以用它来代替原来的指针。这不是它的工作原理,而且对我来说,我需要一个指针的引用以及如何编写它绝对不是很明显。
  • 好吧,这样想——int 是一种类型,而int * 是完全不同的类型,即使你在那里看到了 int 这个词。因此,鉴于此,规则保持不变——您想更改 int*,传递对它的引用,就像您想更改 int 一样。
  • @PaulMcKenzie 作为 C++ 转换者,我不倾向于将指针视为数据类型。我认为它们是一种更深层次的魔法,它允许你与事物的地址进行交互,而不仅仅是事物。我还没有将它内化到只将* 视为运算符或将int * 视为类型的地步。我必须思考这到底意味着什么。
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2016-10-07
  • 2014-12-21
  • 1970-01-01
  • 2015-09-26
  • 2016-06-16
相关资源
最近更新 更多