【问题标题】: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 在运行时可能指向的位置?

标签: c++ c++11 pointers null


【解决方案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) 相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        • 2018-05-16
        • 2021-03-23
        • 1970-01-01
        相关资源
        最近更新 更多