【问题标题】:function returns pointer to int函数返回指向 int 的指针
【发布时间】:2013-03-08 02:28:31
【问题描述】:

调用 add(4) 时,我的 main() 在下面崩溃。

据我了解 int* add,它应该返回一个指向整数的指针。然后,我应该可以主要说:

int * a = add(3);

返回一个指向 int 的指针。

请解释我做错了什么。

#include <cstdlib>
#include <iostream>

using namespace std;

int* add (int a) {
   int * c, d;
   d = a + 1;
   *c = d;
   cout << "c = " << c << endl; 
   return c;
}

int main(int argc, char *argv[])
{
    int a = 4;

    int * c;

    c = add(4); 

    system("PAUSE");
    return EXIT_SUCCESS;
}

【问题讨论】:

  • +1 - @Rubber boots 是正确的
  • 不,他不是。阅读理解,人。 *c = d使c指向d
  • 更糟糕的是,您正在写入并返回一个未初始化的指针。
  • @all - 哎呀,我看到并更正了您的投诉时的评论。现在做什么?我应该删除修改吗?该怎么做?
  • 这太不真实了,当我点击它时,我认为这将是 10 个人争夺正确答案,结果我发现自己对六个错误答案投了反对票

标签: c++ pointers


【解决方案1】:

问题是你已经声明了一个int*,但没有给它任何指向。您需要做的是使用内存位置对其进行初始化(省略错误检查)

int* c = new int();
...
*c = d;  // Now works

稍后您需要确保释放此内存,因为它是分配的资源。

一个更好的解决方案是使用引用。指针有几个讨厌的属性,包括未初始化的值、NULL、需要释放等......其中大部分都不存在于引用中。以下是如何在此场景中使用引用的示例。

void add (int a, int& c) {
   int d;
   d = a + 1;
   c = d;
   cout << "c = " << c << endl; 
}

int c;
add(4, c);

【讨论】:

  • 在 C++ 中,使用malloc 几乎肯定是错误的做法。
  • @Mike,同意了。只阅读问题代码并假设它是一个 C 问题。更新
【解决方案2】:

 *c = d;

指针c 未初始化,因此您的程序会遇到未定义的行为。您可以改为执行以下操作:

void add( int what, int* toWhat )
{
    (*toWhat) += what;
}

然后这样称呼它:

int initialValue = ...;
add( 4, &initialValue );

【讨论】:

    【解决方案3】:

    您永远不会为指针c 分配任何内存。指针必须引用有效内存,并且您必须通过调用 new 自己分配该内存,例如写

    int* c = new int();
    

    add 函数中。现在c 指向一个有效的内存块,它大到足以容纳int。用完该内存后,调用delete c 将其释放并释放回系统。

    【讨论】:

    • 这个问题被标记为 C++,所以使用malloc 是一个非常糟糕的主意。
    • 嗯,不错的主意(malloc 在 C++ 中是完全合法的),但不是最好的主意。不过会修复的。
    【解决方案4】:

    你得到一个错误,因为 c 是一个未初始化的指针,所以它是未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多