即使我写这个陈述
char *test= new char[35];
sizeof(test)将始终返回4(或另一个数字,具体取决于系统)而不是35.我假设这是因为指针的大小严格地是物理“指向实体”而不是保留的内存量对于那个指针。这是对的吗?
此外,有没有办法使用sizeof()检索为特定指针保留的内存量?
答案 0 :(得分:5)
不。
指针只是普通变量(通常实现为整数地址) - 它们可以指向其他对象与sizeof
无关。不要将它们视为“神奇”的东西,这在某种程度上与它们所指向的密切相关。指针只不过是一个街道号码。
我提出这个原因是因为:
[...]指针的大小严格来说是物理“指向实体” 而不是为该指针保留的内存量。
在您的代码行中:
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