指向数组的指针获得大小为C ++的指针

时间:2013-01-18 21:31:29

标签: c++ arrays pointers int

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

如果我使用普通数组,答案将 10 , 唉,印刷的幸运数字是 1 ,因为sizeof(int)是4而iszeof(* int)也是4。我怎么能这个?在我看来,保持内存大小是一个复杂的选择。如何使用代码获得大小?

我最好的猜测是迭代一个数组并搜索它的结尾,结束是0,对吗?有什么建议吗?

- 修改

好吧,我对矢量的担心是它会在推回时重新分配,你得到了重点,我可以分配内存。但是,我无法改变结构,整个代码是相关的。谢谢你的答案,我看到没有办法,所以生病只是寻找一种方法来存储大小的内存。

我问的问题不是什么样的结构。

3 个答案:

答案 0 :(得分:7)

简单。

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

如果您在编译时知道数组的大小,并且不需要在运行时增长,那么使用std::array。否则使用std::vector

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

阅读文档:

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

如果您担心std::vector vs 原始数据的效果,请在此处阅读接受的答案:

它解释了为什么问题中的代码很慢,与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;

答案 1 :(得分:2)

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的方式相比没有任何性能损失。

答案 2 :(得分:0)

如果你不能像你所说的那样使用std :: vector和std :: array,那么你唯一的重新选择就是自己跟踪数组的大小。

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