C++从函数返回指向数组的指针的正确方法

标签 c++ arrays function pointers

我对 C++ 还很陌生,并且一直在避免使用指针。根据我在网上阅读的内容,我无法返回数组,但可以返回指向它的指针。我做了一个小代码来测试它,想知道这是否是正常/正确的方法:

#include <iostream>
using namespace std;

int* test (int in[5]) {
    int* out = in;
    return out;
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int* pArr = test(arr);
    for (int i = 0; i < 5; i++) cout<<pArr[i]<<endl;
    cout<<endl;
    return 0;
}

编辑:这似乎不好。我应该如何重写它?

int* test (int a[5], int b[5]) {
    int c[5];
    for (int i = 0; i < 5; i++) c[i] = a[i]+b[i];
    int* out = c;
    return out;
}

最佳答案

您的代码是正确的,但我很难弄清楚它可以/将如何在现实世界的场景中使用。话虽如此,请注意从函数返回指针时的一些注意事项:

  • 当您使用语法 int arr[5]; 创建数组时,它分配在堆栈上并且是函数本地的。
  • C++ 允许你返回一个指向这个数组的指针,但是在它的本地范围之外使用这个指针指向的内存是未定义的行为。阅读 this great answer using a real world analogy比我能解释的要清楚得多。
  • 如果你能保证数组的内存没有被清除,你仍然可以在作用域之外使用数组。在您的情况下,当您通过 arr 时,这是正确的。至test() .
  • 如果您想传递指向动态分配数组的指针而不担心内存泄漏,您应该阅读 std::unique_ptr/std::shared_ptr<> .

编辑 - 回答矩阵乘法的用例

你有两个选择。天真的方法是使用 std::unique_ptr/std::shared_ptr<> .现代 C++ 方法是有一个 Matrix重载的类operator *你绝对必须使用新的rvalue references如果您想避免复制乘法的结果以使其脱离函数。除了拥有您的copy constructor , operator =destructor ,你还需要有move constructormove assignment operator .浏览this search的问答以更深入地了解如何实现这一目标。

编辑 2 - 对附加问题的回答

int* test (int a[5], int b[5]) {
    int *c = new int[5];

    for (int i = 0; i < 5; i++) 
        c[i] = a[i]+b[i];
    return c;
}

如果您将其用作 int *res = test(a,b); ,那么稍后在您的代码中,您应该调用 delete []res释放 test() 中分配的内存功能。您现在看到的问题是手动跟踪何时调用 delete 非常困难。 .因此,答案中概述了如何处理它的方法。

关于C++从函数返回指向数组的指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12992925/

相关文章:

c++ - 如何检查对象是否在数组中?

r - 使用 ggplot2、aes_string 和 reorder 制作绘图函数

javascript - 按索引从数组输出返回未定义

C数组和函数,如何返回?

c++ - 从文件中读取数学方程式

c++ - Python 等效于 std::set 和 std::multimap

c - 无法删除结构中的确定位置,数据仍然存在

python - 将值作为索引函数分配给 2D numpy 数组的有效方法是什么

C++ 使用模板来避免编译器检查 boolean 值

带有 CWebBrowser2 -> ChromeFrame -> HTML5 应用程序的 C++ (MFC) 应用程序,如何将点击事件从 HTML5 获取到 C++ 应用程序?