有没有办法通过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.
在你的代码行中:
- 在动态内存中分配了一个 35
char
s 的数组
- 它的第一个元素的地址由
new
返回
- 您将此地址保存在
test
中。
请注意,数组的任何概念或其大小在第二步之前都已消失。指针对此一无所知。 你知道。
如果你想检索数组的大小,你需要自己在一个单独的变量中跟踪它,或者使用一个 class 为你做,即 std::vector<char>
.
如其他答案所述,从普通指针无法知道在它指向的位置保留的内存量,因为它仍然指向垃圾。
只要用 C 字符串填充内存,就可以使用 strlen(test)
获取长度,因为它会查找字符串字节 (0x0) 的结尾。
更好的解决方案是使用数组:
char test[35];
szie_t size = sizeof(test); //< returns 35
即使我写这个声明
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.
在你的代码行中:
- 在动态内存中分配了一个 35
char
s 的数组 - 它的第一个元素的地址由
new
返回
- 您将此地址保存在
test
中。
请注意,数组的任何概念或其大小在第二步之前都已消失。指针对此一无所知。 你知道。
如果你想检索数组的大小,你需要自己在一个单独的变量中跟踪它,或者使用一个 class 为你做,即 std::vector<char>
.
如其他答案所述,从普通指针无法知道在它指向的位置保留的内存量,因为它仍然指向垃圾。
只要用 C 字符串填充内存,就可以使用 strlen(test)
获取长度,因为它会查找字符串字节 (0x0) 的结尾。
更好的解决方案是使用数组:
char test[35];
szie_t size = sizeof(test); //< returns 35