拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何处理回传双指标的函式的输出

如何处理回传双指标的函式的输出

白鹭 - 2022-02-13 2120 0 0

我有这个困境。fruit是一个结构。

fruit** func2create(const int N, const int M)
{
    fruit **arr;
    arr = new fruit*[N];

    for(int i = 0; i < N; i  )
    {
        arr[i] = new fruit[M];
    }

    return arr;
}

这个函式回传一个指向二维阵列的指标,至少我认为它是这样做的。

现在,有了这个功能,我该如何使用它来制作一个二维阵列?

uj5u.com热心网友回复:

我不会使用带有双指标的符号。这肯定会导致某个地方的存储器泄漏,因为不清楚谁将清理存储器。在 C 中,我将使用以下方法之一(使用 std::array 或 std::vector)。这也更符合关于使用 new/delete 的 C 核心指南(https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines查找有关指标和/或 new/delete 的任何内容)

#include <array>
#include <vector>

struct fruit
{
};

// sizes know at compile time then use a function template 
template<std::size_t N, std::size_t M>
auto func2create()
{
    // create initialized array
    std::array<std::array<fruit, M>, N> fruits{};
    return fruits;
}

// for runtime sizes use std::vector
// note I don't use ints (they can have negative values
// I don't want to test for that)
auto func2create(const std::size_t n, const std::size_t m)
{
    // create n rows of m fruits
    std::vector<std::vector<fruit>> fruits(n, std::vector<fruit>(m));
    return fruits;
}

int main()
{
    // compile time allocate fruits
    {
        auto fruits = func2create<4, 4>();
        auto fruit = fruits[1][1];
    }

    // runtime alloacted fruits
    {
        auto fruits = func2create(4ul, 4ul);
        auto fruit = fruits[1][1];
    }
    
    return 0;
}

uj5u.com热心网友回复:

例如:

int N = ...;
int M = ...;
fruit** arr = func2create(N, M);

for(int i = 0; i < N;   i) {
    for(int j = 0; j < M;   j) {
        // use arr[i][j] as needed...
    }
}

... 

for(int i = 0; i < N;   i) {
    delete[] arr[i];
}
delete[] arr;
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *