【问题标题】:Assigning a pointer to an array in a function [duplicate]在函数中分配指向数组的指针[重复]
【发布时间】:2018-11-26 06:58:45
【问题描述】:

所以我看到了这段代码,我得到了大部分代码,直到它应该分配一个指向数组的指针。目标是分配是必须程序打印出 100 99 98 3 2 1。所以在我看来,函数 f 什么都不做,所以我删除了它。我的问题是如何将指针分配给函数内的数组?我还认为返回数组会起作用,但没有成功。提前致谢

#include <iostream>
using namespace std;

int* nochange(int* p)
{
    return p;
}

int* getPtrToArray(int& m)
{
    int anArray[100];
    for (int j = 0; j < 100; j++)
        anArray[j] = 100-j;
    m = 100;
    return nochange(anArray);
}

void f()
{
    int junk[100];
    for (int k = 0; k < 100; k++)
        junk[k] = 123400000 + k;
    junk[50]++;
}

int main()
{
    int n;
    int* ptr = getPtrToArray(n);
    f();
    for (int i = 0; i < 3; i++)
        cout << ptr[i] << ' ';
    for (int i = n-3; i < n; i++)
        cout << ptr[i] << ' ';
    cout << endl;
}c

【问题讨论】:

  • 你已经创建了local int anArray[100];,一旦你从函数返回指针就失效了。
  • “所以我看到了这段代码”——告诉任何提交它的人他们的代码调用了未定义的行为,甚至猜测会发生什么都是疯狂的追求。 anArray 是 getPtrToArray 的本地地址。函数nochange 是没有意义的,它返回给定的指针,在这种情况下,指向anArray 的第一个元素的指针,一旦getPtrToArray 返回,它就会过期。因此,该指针结果毫无价值。对它的任何引用或通过它调用未定义的行为。
  • 要注意的事情,1) 局部变量是在堆栈上创建的,如果您希望在函数外部可见,请使用全局或动态为数组分配内存并自行管理或作为建议将其设为静态函数。 2) 指针可以作为参数返回或传回,但前提是您传递指针的地址。

标签: c++ arrays function pointers


【解决方案1】:

你可以像这样从函数返回指针:

int* getPtrToArray(int& m)
{
    int *anArray = new int[100];
    for(int j = 0; j < 100; j++)
        anArray[j] = 100 - j;
    m = 100;
    return anArray;
}

int main()
{
    int n = 0;
    int* ptr = getPtrToArray(n);

    for(int i = 0; i < 3; i++)
        cout << ptr[i] << ' ';
    for(int i = n - 3; i < n; i++)
        cout << ptr[i] << ' ';
    cout << endl;

    delete []ptr; // you should free memory here
}    

但这是一种糟糕的风格:在一个地方分配内存,在另一个地方释放。

最好将指向数组的指针传递到函数中,如下所示:

void fillArray(int *arr, int m)
{
    for(int j = 0; j < m; j++)
        arr[j] = m - j;
}

int main()
{
    const int M=100;
    int arr[M] = {0};
    fillArray(arr, M);
    //...
}

更现代的方法涉及使用向量:

#include <vector>

vector<int> getArray()
{
    vector<int> arr(100);
    for(int j = 0; j < 100; j++)
        arr[j] = 100 - j;
    return arr;
}

int main()
{
    auto arr = getArray();
    size_t n = arr.size();
    // ...    
    for(int i = n - 3; i < n; i++)
        cout << arr[i] << ' ';
}    

【讨论】:

  • 感谢它的效果很好,我可以发誓我曾尝试让函数返回数组,但也许还有其他问题。有没有将 100 分配给 m 的点?还有为什么需要一个新的阵列?提前致谢
  • @SerotheHero 如果您使用向量,则大小将存储在其中。您可以通过 size() 函数获取它。在您的 getPtrToArray 函数中,您返回了一个指向本地数组的指针,该数组在退出函数后被销毁,因此您需要“new”来在堆中创建数组,而不是在堆栈中。
【解决方案2】:

anArray 对函数 getPtrToArray 是本地的,因此生命周期和可见性仅对函数 getPtrToArray。 将其定义为静态数组会增加它在程序范围内的生命周期。

静态 int anArray[100];

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2011-02-24
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多