例如,我有一个如下功能。
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)
对指针数组不起作用。因此,我无法显示或使用数组,因为我不知道它的大小。无论如何让函数返回大小(或计算它)和数组?谢谢!
在提供替代解决方案(例如使用矢量)之前,请先推荐补救措施。
答案 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;
}