将数组从一个函数传递给另一个函数

时间:2015-11-21 18:54:15

标签: c++

我想通过遵守代码让我感到困惑。假设我有两个简单的函数:

int* makeiniele()
{
    int res[55] = { 0 };
    return res;
}

void printele(int* wxyz)
{
    for (int k = 0; k < 55; k++)
    {
        cout << wxyz[k] << "\n";
    }
}

问题在于我运行以下行:

printele(makeiniele());

我得到55个大的负数而不是55个零!

感谢您的时间

3 个答案:

答案 0 :(得分:0)

两个问题:

1)数组未初始化为包含55个零,但只有1个,其余54个元素将是一些较旧的内存内容:

int res[55] = { 0 };

您需要使用memset()函数才能有效地执行此操作:

int res[55];
memset(res, 0, sizeof(res));

2)您在makeiniele()函数中声明的数组将在从函数返回后被释放(并且因为它存在于堆栈中),其内容将被下一个函数{{的调用覆盖。 1}}。因此,正确初始化不会解决您的问题。

解决方案是考虑使用printele()来分配数组。您的malloc()函数应如下所示:

makeiniele()

请记住在完成数组后调用int* makeiniele(){ int *res = malloc(sizeof(int)*55)); memset(res, 0, sizeof(int)*55); return res; } 以避免内存泄漏。

答案 1 :(得分:0)

int* makeiniele()
{
    int res[55] = { 0 };
    return res;
}

问题在于范围 - 一旦函数结束,函数中声明的任何变量都将从内存中删除。函数makeiniele终止后,数组res也会从内存中删除。阵列占用的内存已经被其他东西取代了 - 这个“别的东西”就是在屏幕上打印出来的东西。您可以使用以下代码进行验证:

int * myvar = new int[55]{ 0 };
int* var = myvar;
printele(var);
delete myvar;
printele(var);

第55个数字将为零(该变量尚未删除)。一旦用delete手动删除变量,它的地址现在指向未使用的内存,因此它会随机输出数字。要解决此问题,请将此makeiniele功能替换为:

int* makeiniele()
{
    int * myvar = new int[55]{ 0 };
    return myvar;
}

一切都应该正常工作!

编辑:正如Zereges所说,你必须确保以

结束你的程序
delete myvar;

防止内存泄漏。

答案 2 :(得分:0)

一个现代的C ++答案。

使用聪明的数组(std::vector

std::vector<int> makeiniele()
{
    std::vector<int> res(55, 0);
    return std::move(res);
}

void printele(const std::vector<int>& wxyz)
{
    for (int k = 0; k < 55; k++)
    {
        cout << wxyz[k] << "\n";
    }
}

或使用聪明的指针(std::shared_ptr

std::shared_ptr<int> makeiniele()
{
    std::shared_ptr<int> res(new int[55]);
    std::memset(res.get(), 0, 55 * sizeof(int));
    return std::move(res);
}

void printele(std::shared_ptr<int> wxyz)
{
    for (int k = 0; k < 55; k++)
    {
        std::cout << wxyz.get()[k] << "\n";
    }
}