我应该怎么做才能获得"动态"数组的大小?
What should I do to get the size of a 'dynamic' array?
我有这段代码。
int x[5];
printf("%dn",sizeof(x) );
int *a;
a = new int[3];
printf("%dn",sizeof(*a));
当我将"static"数组传递给sizeof()时,它返回声明数组的维度乘以数据类型在内存中使用的字节数。然而,动态数组似乎有所不同。我的问题是,我应该如何获得"动态"数组的大小?
PD:这可能与以下内容有关吗?
int *a;
a=new int[3];
a[0]=3;
a[1]=4;
a[2]=5;
a[3]=6;
如果假设我在"a=new int[3]"中加了一个"limit",为什么我可以修改第三个位置。
当我将"static"数组传递给sizeof()时,它返回声明数组的维度乘以数据类型在内存中使用的字节数。
正确,这就是计算整个数组大小的方法。
然而,动态数组似乎有所不同。
这是因为您没有传递动态数组;你在传球。指针是一种数据类型,其大小与它可能指向的内存块的大小无关,因此您总是得到一个常数值。当你为动态大小的内存块分配内存时,你需要存储分配的大小以备将来参考:
size_t count = 123; // <<== You can compute this count dynamically
int *array = new int[count];
cout << "Array size: " << (sizeof(*array) * count) << endl;
C++14将具有可变长度的数组。当您选中sizeof
时,这些阵列将提供适当的大小。
它可能与以下内容有关吗?[…]
不,这是无关的。您的代码片段显示了未定义的行为(写入超过分配的内存块的末尾),这意味着您的代码无效。它可能会立即崩溃,随后导致崩溃,或者表现出其他任意行为。
在C++中,数组在运行时没有任何内部大小。
在编译时,可以使用所示的sizeof
来获得编译器已知的大小,但如果实际大小直到运行时才知道,则程序有责任跟踪长度。
两种流行的策略是:
- 保留一个单独的变量,该变量包含数组的当前长度
- 在数组末尾添加一个额外的元素,该元素包含某种标记值,表示它是最后一个元素。例如,如果已知数组只有正整数,则可以使用
-1
作为标记
如果您不跟踪数组的末尾,并且您的写入超出了分配的范围,那么您就有可能覆盖存储在内存中数组附近的其他数据,这可能会导致崩溃或其他未定义的行为。
其他语言倾向于使用前一种策略,并提供一种获取当前长度记录的机制。一些语言还允许在创建数组后动态调整数组大小,这通常包括创建一个新数组,并在销毁原始数组之前复制所有数据。
标准库中的vector
类型提供了对数组的抽象,当数据的大小直到运行时才知道时,这种抽象会更方便。它跟踪当前阵列的大小,并允许阵列稍后增长。例如:
#include <vector>
int main() {
std::vector<int> a;
a.push_back(3);
a.push_back(4);
a.push_back(5);
a.push_back(6);
printf("%dn", a.size());
return 0;
}
附带说明一下,由于a.size()
(和sizeof(...)
)返回的size_t
不一定与int
大小相同(尽管它恰好在某些平台上),因此将printf
与%d
一起使用是不可移植的。相反,可以使用iostream
,它也是更惯用的C++:
#include <iostream>
std::cout << a.size() << 'n';
您没有,至少在标准C++中没有。您必须自己跟踪它,使用std::vector等原始指针的替代方法来跟踪为您分配的大小,或者使用_msize等非标准函数https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/msize?view=msvc-在Microsoft Windows上为160或malloc_sizehttps://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/malloc_size.3.html在MacOS X上。
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结