【问题标题】:c++ passing Pointers into a function, for passing int arrays out of and into a functionc ++将指针传递给函数,用于将int数组传入和传入函数
【发布时间】:2012-09-23 00:07:14
【问题描述】:

我正在尝试传递一个 int 数组。下面是我想做的一个例子。基本上,我可以编写一个函数,通过返回一个指针来返回一个 int 数组。现在我想采用该函数并将其用作另一个函数的参数。目标是让一个函数创建一个 int 数组,然后将其放入另一个将 int 数组作为输入的函数。它不起作用。在接受 int * 指针的函数内部,int * 指针刚刚变为 -8435432,并且在将其分配给另一个 int * 指针后无法读取其元素。我不明白。为什么我可以从函数中取回一个 int 数组,但它不能用作另一个函数的输入?

int * returnIntArray()
{
    int * thePointer;
    int j[3];
    thePointer = j;

    j[0] = 1;
    j[1] = 3;
    j[2] = -1;
    return thePointer;
}

//
int * takesTheIntArray(int * anIntArray)
{
    int x,y,z;
    int * returnIt;
    returnIt = anIntArray;
    x = returnIt[0];
    y = returnIt[1];
    z = returnIt[3];
    return returnIt;
}


int _tmain(int argc, _TCHAR* argv[])
{
    int y,z,p;
    int * x;
    x = returnIntArray();
    y = x[0];
    z = x[1];
    x = takesTheIntArray(returnIntArray());
    cout << x[0] << ",  " << x[1];
    //cout << theVector[1];
    cout << "hello";
}

【问题讨论】:

  • stackoverflow.com/questions/6441218/…。短篇小说:使用容器。
  • 是的,不开玩笑,但问题仍然存在。这可能吗?
  • 第一个可能起作用的唯一原因是因为它不起作用。数组超出范围。访问它们是未定义的行为。

标签: c++ arrays pointers


【解决方案1】:
int * thePointer;
    int j[3];
    thePointer = j;

应该是:

int* thePointer = new int[3];

第一个版本的问题是您返回的东西是静态分配的(分配在堆栈上)。当函数返回时,它将超出范围。在第二个版本中,它是动态分配的(在堆上分配)。完成后记得在指针上调用delete[](否则会泄漏内存)。

【讨论】:

    【解决方案2】:

    你可以重写 returnIntArray() 如下:

    int * returnIntArray()
    {
        static int j[3];
    
        j[0] = 1;
        j[1] = 3;
        j[2] = -1;
        return j;
    }
    

    您不需要“thePointer”变量,它只会隐藏您的 j 是在作用域末尾被销毁的局部变量这一事实。您可能已经尝试不使用“thePointer”变量并获得“警告 C4172:返回局部变量或临时地址的地址”,这意味着您返回的值在返回后将无效(与 thePointer 相同的问题)。 j 声明之前的 static 使 j 成为全局的(但只能通过它在函数中的名称获得),因此 j 包含的值不会在作用域的末尾丢失。

    我不明白“takesTheIntArray”的意义何在,也许是在调试器中查看 x、y、z 值的调试目的?如果是这种情况,您不需要复制指针,只需执行以下操作:

    //
    int * takesTheIntArray(int * anIntArray)
    {
        int x,y,z;
        x = anIntArray[0];
        y = anIntArray[1];
        z = anIntArray[2];
        return anIntArray;
    }
    

    保留您的主要内容,这应该可以按您的意愿工作:) [编辑]在“takesTheIntArray”中有一个错字,我在重新发布时没有注意到:z var 的 anIntArray 索引应该是 2 而不是 3[/edit]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2012-11-23
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多