有没有办法通过sizeof()来计算一个指向向量的大小?

Is there a way to calculate the size of a pointed vector through sizeof()?

即使我写这个声明

char *test= new char[35];

sizeof(test) 将始终 return 4(或取决于系统的另一个数字)而不是 35。我认为这是因为指针的大小严格地是物理 "pointing entity"而不是为该指针保留的内存量。正确吗?

此外,有没有办法使用 sizeof() 检索为特定指针保留的内存量?

I assume that this is because the size of a pointer is strictly the physical "pointing entity" and not the amount of memory reserved for that pointer. Is it correct?

是的,这是正确的;您正在使用 sizeof() 指针。指针是内存中的地址;在 32 位系统上,这将是 4 个字节。 64位系统为8字节。

Moreover, is there a way to retrieve the amount of memory reserved for a particular pointer using sizeof()?

没有。 sizeof() 不知道指针指向什么;这是一个编译时计算。获得此大小将取决于它的分配方式。

一般来说,您应该使用 std::vector<>。要获得 std::vector<> 的大小,请使用 std::vector<>::size().

没有。

指针只是普通变量(通常实现为整数地址)——它们可以指向其他对象与 sizeof 无关。不要将它们视为某种东西 "magic",它们以某种方式与它们指向的内容紧密相关。指针只不过是一个街道号码。

我提出这个问题是因为:

[...] the size of a pointer is strictly the physical "pointing entity" and not the amount of memory reserved for that pointer.

在你的代码行中:

  • 在动态内存中分配了一个 35chars 的数组
  • 它的第一个元素的地址由new
  • 返回
  • 您将此地址保存在 test 中。

请注意,数组的任何概念或其大小在第二步之前都已消失。指针对此一无所知。 知道。

如果你想检索数组的大小,你需要自己在一个单独的变量中跟踪它,或者使用一个 class 为你做,即 std::vector<char>.

如其他答案所述,从普通指针无法知道在它指向的位置保留的内存量,因为它仍然指向垃圾。

只要用 C 字符串填充内存,就可以使用 strlen(test) 获取长度,因为它会查找字符串字节 (0x0) 的结尾。

更好的解决方案是使用数组:

char test[35];
szie_t size = sizeof(test); //< returns 35