为啥即使我们将指针分配给NULL,指针的指向对象的大小也不为零?

Posted

技术标签:

【中文标题】为啥即使我们将指针分配给NULL,指针的指向对象的大小也不为零?【英文标题】:Why size of pointed object of pointer is not zero even if we assigned pointer to NULL?为什么即使我们将指针分配给NULL,指针的指向对象的大小也不为零? 【发布时间】:2019-07-24 07:54:06 【问题描述】:

我想知道为什么即使我们将指针分配给NULL,指针指向的对象的大小也不为零。谁能解释一下?

在 g++ 4.8、ubuntu 14.04 上编译

Foo * foo=NULL;
cout<<"Size of pointed object of foo:"<<sizeof(*foo)<<endl;  //why it is not zero

【问题讨论】:

因为你问的是Foo类型的大小,而不是foo的内容。 sizeof(*foo) 在编译时进行评估。它只是变成Foo 对象的大小,而不管foo 指针的值在cout... 行运行时是什么值。它不会在运行时进行空指针检查以查看它是否指向任何地方。 但是 foo 仍然没有指向任何 Foo 对象。为什么它显示 (Foo) 的大小 @RamCharan 如何在编译时知道foo 在运行时可能指向的位置? 【参考方案1】:

sizeof 是一个compile time 指令。因此,没有运行时检查来查看指针是否实际指向真实对象。根本没有检查指针。该指令被编译器替换为类型的字节大小,在您的情况下为Foo

【讨论】:

【参考方案2】:

sizeof 中,我们位于unevaluated context 中。它里面的任何表达式都不会被计算。 sizeof 只关心你传递给它的表达式的类型*foo 的类型当然是Foo&amp;sizeof ignores the reference,因此它返回 Foo 类型的对象将占用的字节大小。

再次注意,您编写的表达式永远不会被计算,因此foo 指向的位置是否存在Foo 对象并不重要——foo 的值(以及它指向的内存内容)与sizeof 无关。

【讨论】:

【参考方案3】:

sizeof 适用于类型,而不是值。 *foo 的类型(粗略地说)是Foo,所以sizeof(*foo)sizeof(Foo) 相同。

【讨论】:

以上是关于为啥即使我们将指针分配给NULL,指针的指向对象的大小也不为零?的主要内容,如果未能解决你的问题,请参考以下文章

将第二个指针分配给第一个指针指向的对象

将指向单例的指针分配给对象字段

为啥指针可以为NULL

对 NULL 指针连续 free多次会出错吗?为啥?

二级指针补充

指针定义NULL后无法赋值?