【问题标题】:C++ return pointer to dynamically allocated arrayC++返回指向动态分配数组的指针
【发布时间】:2018-01-13 10:38:54
【问题描述】:

我正在阅读这篇文章 [Function returning a pointer to an int array] 并了解返回 pointer to intpointer to an array of int 之间的区别。
我在尝试总结时遇到了一些问题。首先,看一下这段代码(保持简单):

函数 testtest2 返回 pointer to intpointer to an array of int

int* test(size_t &sz) {
    int *out = new int[5];
    sz = 5;
    return out;
}

int (*test2())[3] {
    static int out[] = {1, 2, 3};
    return &out;
}

如何更改 test2 才能使用动态数组(不是静态数组)?是否可以将数组大小作为参考或以某种方式传递?
主要功能看起来像这样。代码编译。

int main() {
    size_t sz;
    int *array = test(sz);
    for (size_t i = 0; i != sz; ++i) {
        array[i] = 10;
        cout << *(array + i) << " ";
    }
    cout << endl;    
    delete[] array;

    int (*array2)[3] = test2();
    for (size_t i = 0; i != 3; ++i) {
        cout << (*array2)[i] << " ";
    }
}

结果

10 10 10 10 10 
1 2 3 

【问题讨论】:

  • 为什么还要使用动态分配的数组呢? std::vector呢?
  • 另外,如果您的问题标题是 return &amp;out;,请记住 staticdynamic 的反义词
  • 我不是编译器,但 test2 不会在我的脑海中编译。
  • 它会编译。我不能用动态数组得到它。

标签: c++ arrays pointers


【解决方案1】:

test2 不返回指向单个 int 的指针,而是返回指向 3 元素 int 数组的指针。我鼓励您尝试精彩的https://cdecl.org/ 网站,输入int (*test2())[3] 并亲自查看。

您可能尝试返回new int[3],但失败了。这是因为new[] 返回一个指向单个int(动态分配数组的第一个元素)的指针,而指向单个int 的指针不会自动转换为指向包含许多int 的整个数组的指针秒。

如何更改 test2 以使用动态数组(非静态)?

严格来说,像这样:

int (*test2())[3] {
    return reinterpret_cast<int(*)[3]>(new int[3] { 1, 2, 3 }); // horrible code
}

是否可以将数组大小作为参考或以某种方式传递?

test2 的情况下,数组的大小是类型的一部分,因此在编译时是固定的。您不能在运行时通过传递引用来更改类型。


现在,说真的。

没有人在他们的脑海中写出这样的代码。 new[] 已经是一个非常糟糕的语言特性,而且你对额外的指针、引用和 C 语法特性的额外混淆并不能使它变得更好。这是 C++,使用std::vector

#include <iostream>
#include <vector>

std::vector<int> test() {
    return { 1, 2, 3 };
}

int main() {
    for (auto num : test()) {
        std::cout << num << " ";
    }
}

【讨论】:

  • @ChistianHackl,很棒的答案,特别感谢“cdecl.org”网站
猜你喜欢
  • 2013-05-26
  • 1970-01-01
  • 2021-03-29
  • 2018-07-29
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多