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

时间:2015-02-13 11:04:17

标签: c++ pointers sizeof

即使我写这个陈述

char *test= new char[35];

sizeof(test)将始终返回4(或另一个数字,具体取决于系统)而不是35.我假设这是因为指针的大小严格地是物理“指向实体”而不是保留的内存量对于那个指针。这是对的吗?

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

3 个答案:

答案 0 :(得分:5)

不。

指针只是普通变量(通常实现为整数地址) - 它们可以指向其他对象与sizeof无关。不要将它们视为“神奇”的东西,这在某种程度上与它们所指向的密切相关。指针只不过是一个街道号码。

我提出这个原因是因为:

  

[...]指针的大小严格来说是物理“指向实体”   而不是为该指针保留的内存量

在您的代码行中:

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

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

如果要检索数组的大小,则需要在单独的变量中自行跟踪它,或者使用为您执行此操作的类,即std::vector<char>

答案 1 :(得分:4)

  

我认为这是因为指针的大小严格地说是物理&#34;指向实体&#34;而不是为该指针保留的内存量。这是对的吗?

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

  

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

没有。 sizeof()对指针指向的内容一无所知;它是一个编译时计算。获得这个大小将取决于它的分配方式。

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

答案 2 :(得分:0)

正如在其他答案中所说的那样,从正常指针中无法知道在它指向的位置保留的内存量,因为它仍然指向垃圾。

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

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

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