C++中动态数组的长度

3
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

可能重复:
如何查找指向数组的指针的大小

我这样声明了一个动态数组:

int *arr = new int[n];   //n is entered by user 

然后使用此方法找到数组的长度:
int len = sizeof(arr)/sizeof(int);

它返回1而不是n,为什么?

10
只需使用向量,您就能节省大量时间。 - Caesar
2
int *arr = new int[n]; 声明了一个指针。std::vector<int> arr; 声明了一个动态数组。 - R. Martinho Fernandes
你没有动态数组 -- 你只有一个指向动态数组第一个元素的指针。 - Kerrek SB
1
@Jatin 不,没有其他方法。你必须存储长度并在需要时传递它。 - Daniel Fischer
@Jatin:不是。是第一次指定长度的人,所以你应该记住它。 - Kerrek SB
显示剩余2条评论
3个回答

12

由于sizeof不能用于动态数组。它会给你指针的大小,因为int *arr是一个指针。

您应该存储分配数组的大小或最好使用std::vector


类似这样的语句 int arr[n] 是有效的吗?其中 n 是由用户输入的变量? - Jatin
@Jatin:n必须是const或者const-expression。否则编译器在编译时不知道要分配多少内存,导致无法通过编译。 - Andrew
令人惊讶的是,它在code::blocks上编译通过了。 - Jatin
@Jatin 将编译器设置为符合标准的模式,并打开所有警告 (-std=c++98-std=c++0x-std=c++11 以及 -Wall -Wextra -pedantic 中的所有选项)。它可能会编译通过,因为使用了 GNU 扩展。 - R. Martinho Fernandes
@Jatin gcc在C++中有可变长度数组作为扩展功能,我认为Code::Blocks使用gcc。 - Daniel Fischer

11
因为arr不是一个数组,而是一个指针,在您运行大小等于int的指针体系结构上。

0

安德鲁是正确的。 你必须在某个地方保存n(取决于你在哪里使用它)。或者如果你正在使用.NET,你可以使用数组或列表...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接