我应该怎么做才能获得"动态"数组的大小?

What should I do to get the size of a 'dynamic' array?

本文关键字:数组 动态 我应该      更新时间:2023-10-16

我有这段代码。

   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上。