【问题标题】:C6001 : Not initalized storage is being used, although I did that [closed]C6001:未使用初始化存储,尽管我这样做了[关闭]
【发布时间】:2019-08-25 17:59:01
【问题描述】:
  int num = 5;
  int* ptr = new int;
  int** ptr2 = new int*;
  int*** ptr3 = new int**;

  ptr = #
  *ptr2 = ptr;

这是给我一个错误的行 我显然想让 ptr3 指向 ptr2 但由于 C6001 它确实不起作用

  **ptr3 = *ptr2;

  std::cout << ***ptr3 << std::endl;

  delete ptr;
  delete *ptr2;
  delete **ptr3; 

【问题讨论】:

  • “我显然想让 ptr3 指向 ptr2” 好吧,你可能正在尝试,但你失败了。那将是ptr3 = &amp;ptr2;
  • 停止使用原始指针和new,因为没有简洁的 c++ 推理。
  • 三星级编程!
  • @Eljay 是的,这就是让迷失的灵魂更优秀的原因,但在现实中完全失败了。
  • 根据经验;您使用的星星 (*) 越多,您的 C++ 程序员就越差。 最好的 C++ 程序员几乎从不使用任何星号,当他们使用时,它们是表示非拥有指针的单星号。当然,泛泛而谈,但离事实不远。研究容器和智能指针,停止手动内存管理。

标签: c++ pointers storage


【解决方案1】:

所以下面的代码实现了我认为你想要实现的目标

int num = 5;
int* ptr = &num;
int** ptr2 = &ptr;
int*** ptr3 = &ptr2;

现在ptr3 指向ptr2,它指向ptr,它指向num。但是请注意这里根本没有分配。

当您分配内存时,指针最终指向已分配的内存。在您的代码中,就好像您认为您需要为指针本身分配内存。但事实并非如此。指针只需通过声明即可获得它的内存。然后由你决定让指针指向某个东西,无论是新分配的内存还是其他一些变量。

在我看来,关于指针的所有混淆基本上都是因为新手无法正确区分 指针和指向的内容。

【讨论】:

  • “有时在我看来,所有关于指针的混淆基本上是因为新手无法正确区分指针和指向的内容。” - 你不是唯一的。
【解决方案2】:

*ptr3 取消引用 ptr3 - 结果是您之前使用 new int** 分配的未初始化的 int** 指针;我们就叫它X吧。

**ptr3 等同于 *X - 它尝试取消引用未初始化的指针,从而您的程序表现出未定义的行为。

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多