繁体   English   中英

指向数组的指针获取大小C ++

[英]Pointer to an array get size C++

int * a;
a = new int[10];
cout << sizeof(a)/sizeof(int);

如果我使用普通数组,答案将是10 ,a,幸运数字是1 ,因为sizeof(int)是4,iszeof(* int)也是4。 我该如何推荐? 就我而言,在内存中保留大小是一个复杂的选择。 如何使用代码获取尺寸?

我最好的猜测是遍历数组并搜索其结尾,结尾为0,对吗? 有什么建议么?

- 编辑

好吧,我担心向量是它会在回推的同时重新分配,这很重要,我可以判断是否分配了内存。 但是我无法更改结构,所以整个代码都是相对的。 感谢您的回答,我发现没有办法了,所以请寻找一种将大小存储在内存中的方法。

我问什么,不是要使用哪种结构。

简单。

使用std::vector<int>std::array<int, N> (其中N是编译时常量)。

如果您知道在编译时数组的大小,并且不需要在运行时进行扩展,请使用std::array 否则使用std::vector

这些被称为序列容器类,它们定义了一个称为size()的成员函数,该函数返回容器中元素的数量。 您可以在需要知道尺寸时使用它。 :-)

阅读文档:

当您使用std::vector ,如果您对容器将要容纳的元素数量有一些模糊的想法,则应考虑使用reserve() 这将为您带来性能优势。

如果您担心std::vectorraw-arrays的性能 ,请在此处阅读公认的答案:

它解释了为什么问题中的代码很慢,这与std::vector本身无关 ,而与它的错误用法无关


如果您不能使用它们中的任何一个,而被迫使用int* ,那么我建议这两种选择。 选择适合您需要的任何东西。

struct array
{
      int *elements;  //elements
      size_t size;    //number of elements
};

这是不言自明的。

第二个是这样:为另一个元素分配内存,并将大小存储在第一个元素中,如下所示:

int N = howManyElements();
int *array = int new[N+1];  //allocate memory for size storage also!
array[0] = N; //store N in the first element!

//your code : iterate i=1 to i<=N 

//must delete it once done
delete []array;

sizeof(a)将是指针的大小,而不是分配的数组的大小。

分配数组后,无法获取数组的大小。 sizeof运算符必须能够在编译时进行评估。

编译器如何知道此函数中的数组有多大?

void foo(int size)
{
    int * a;
    a = new int[size];
    cout << sizeof(a)/sizeof(int);
    delete[] a;
}

不能。 因此sizeof运算符不可能返回分配的数组的大小。 而且,实际上,没有可靠的方法来获取使用new分配的数组的大小。 让我重复一遍,没有可靠的方法来获取使用new分配的数组的大小 您必须将大小存储在某个地方。

幸运的是,这个问题已经为您解决,并且可以保证在任何C ++实现中都存在。 如果您想要一个很好的数组来存储大小和数组,请使用::std::vector 特别是如果您使用new来分配数组。

#include <vector>

void foo(int size)
{
    ::std::vector<int> a(size);
    cout << a.size();
}

妳去 请注意,您不再需要记住将其删除。 还要注意的是,以这种方式使用::std::vector不会比以您原来的方式使用new性能损失。

如果您不能像您所说的那样使用std :: vector和std :: array,那么唯一的保留方法是自己跟踪数组的大小。

我仍然怀疑您避免std :: vector的原因被误导了。 即使对于性能监控软件,矢量的智能使用也是合理的。 如果您担心调整大小,则可以将向量预分配为适当的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM