通过指针从c ++函数返回数组,但程序如何知道数组大小?

时间:2014-04-13 19:17:08

标签: c++ arrays pointers

例如,我有一个如下功能。

int* function(int a)
{
    int b = 2;
    int *c = new int[b];
    return c;
}

我的主要功能是这样称呼:

int main()
{
    int *array = function(123);
    return 0;
}

但是,我不知道array的数组长度,因为我传递了一个指针。显然,sizeof(array)/sizeof(*array)对指针数组不起作用。因此,我无法显示或使用数组,因为我不知道它的大小。无论如何让函数返回大小(或计算它)和数组?谢谢!

在提供替代解决方案(例如使用矢量)之前,请先推荐补救措施。

4 个答案:

答案 0 :(得分:3)

您的问题非常有意义,因为C ++运行时必须知道分配的数组有多大。

然而,给定指针的运行时确实可以找到用new[]分配的内存块的大小以及分配的数组的元素数量(至少如果破坏需要代码),那么就没有可移植的方式使用C ++代码获取此信息。

标准解决方案是返回一个std::vector实例,而不是指针和大小(一个非常常见的实现只是一个指针,一个用过的部分的大小和一个可用的大小)新元素的额外内存,不需要重新分配)。

答案 1 :(得分:2)

您使用的是C ++,使用类std::tuple。无论如何,原始指针是不受欢迎的,如果可能的话,最好使用像std::vector这样的标准容器。

如果你真的不想这样做,你必须以其他方式传递长度,例如使用指针或引用。您可以改为使用哨兵值或使长度合同。

有些人似乎认为C ++运行时必须有一个提供最初要求的类型和元素计数的秘密标记,只是为了清楚:大多数常见实现既不保存大多数情况,也只保存使用{{分配的元素计数1}}具有非平凡析构函数或自定义new[] new[]对的类型,需要元素计数。

答案 2 :(得分:2)

对于特定问题,您可以将指针或引用传递给函数,该函数将由函数更新以存储数组的大小。它经常在图书馆设计中使用。

int* function(int a, int* size)
{
    int b = 2;
    *size = b;
    int *c = new int[b];
    return c;
}

int main()
{
    int sizeofarray;
    int *array = function(123, &sizeofarray);
    return 0;
}

* P.S。 Deduplicator关于使用标准容器是正确的: - )

答案 3 :(得分:1)

一个简单的解决方案可能是

struct array
{
    int *data;
    int  size;
};

array function(int a)
{
    int b = 3;
    int *c = new int[b];
    array arr = { c, b };
    return arr;
}

int main()
{
    array arr = function(123);
    std::cout << arr.size;
    return 0;
}