即使我写了这个语句
char *test= new char[35];
sizeof(test)将始终返回4(或取决于系统的其他数字)而不是35。我认为这是因为指针的大小严格来说是物理"指向实体",而不是为该指针保留的内存量。这是正确的吗?
此外,有没有一种方法可以使用sizeof()来检索为特定指针保留的内存量?
没有。
指针只是普通变量(通常实现为整数地址)——它们可以指向其他对象与sizeof
无关。不要把它们看作是某种"魔法",它与它们所指向的东西有着密切的联系。指针只不过是一个街道编号。
我提起这个是因为:
[…]指针的大小严格来说是物理的"指向实体"而不是为该指针保留的内存量。
在你的代码行中:
- 在动态存储器中分配35个
char
的阵列 - 其第一个元素的地址由
new
返回 - 您将此地址保存在
test
中
请注意,数组或数组大小的任何概念在第二步之前都已消失。指针对此一无所知。你知道。
如果您想检索数组的大小,您需要在一个单独的变量中自己跟踪它,或者使用一个为您做这件事的类,即std::vector<char>
。
我认为这是因为指针的大小严格来说是物理"指向实体",而不是为该指针保留的内存量。这是正确的吗?
是的,这是正确的;您将sizeof()
作为指针。指针是内存中的一个地址;在32位系统上,这将是4个字节。64位系统,它将是8个字节。
此外,有没有一种方法可以使用sizeof()来检索为特定指针保留的内存量?
没有。sizeof()
对指针指向什么一无所知;这是一个编译时计算。获得这个大小将取决于它的分配方式。
一般来说,您应该使用std::vector<>
。要获取std::vector<>
的大小,请使用std::vector<>::size()
。
正如其他答案中所说,从正常指针无法知道它所指向的点上保留的内存量,因为它仍然指向垃圾。
一旦用C字符串填充内存,就可以用strlen(test)
获得长度,因为它会查找字符串字节(0x0)的末尾。
更好的解决方案是使用阵列:
char test[35];
szie_t size = sizeof(test); //< returns 35