繁体   English   中英

c ++将指针传递给函数,用于将int数组传递出函数

[英]c++ passing Pointers into a function, for passing int arrays out of and into a function

我试图传递一个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";
}
int * thePointer;
    int j[3];
    thePointer = j;

应该:

int* thePointer = new int[3];

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

您可以重写returnIntArray(),如下所示:

int * returnIntArray()
{
    static int j[3];

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

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

我不明白“takeTheIntArray”可能是一个调试目的,看看调试器中的x,y,z值是什么意思? 如果是这种情况,您不需要复制指针,只需执行以下操作:

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

保持你的主要,这应该按你想要的方式工作:) [编辑]“takeTheIntArray”中有一个拼写错误我在重新发布时没有注意到:z var的anIntArray索引应该是2而不是3 [/ edit]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM