为啥即使我们将指针分配给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&
。 sizeof
ignores the reference,因此它返回 Foo
类型的对象将占用的字节大小。
再次注意,您编写的表达式永远不会被计算,因此foo
指向的位置是否存在Foo
对象并不重要——foo
的值(以及它指向的内存内容)与sizeof
无关。
【讨论】:
【参考方案3】:sizeof
适用于类型,而不是值。 *foo
的类型(粗略地说)是Foo
,所以sizeof(*foo)
与sizeof(Foo)
相同。
【讨论】:
以上是关于为啥即使我们将指针分配给NULL,指针的指向对象的大小也不为零?的主要内容,如果未能解决你的问题,请参考以下文章