【问题标题】:Does sizeof(* struct pointer) give you the value of structuresizeof(* struct pointer) 是否为您提供结构的值
【发布时间】:2018-05-09 05:14:59
【问题描述】:

我有这样的结构 sizeof 函数的输出是什么。

struct sample
{
    int a;
    char b;
};

struct sample obj;
struct sample * ptr;

sizeof(*ptr);

我使用 gcc 编译器在 C 中尝试了这段代码,这给了我结构本身的大小。 但我怀疑这是否会在与其他 C 编译器以及 C++ 一起尝试时产生相同的结果。

你能帮我解决这个问题吗?

提前致谢。

【问题讨论】:

  • sizeof(*ptr); 是 UB,因为 ptr 没有指向有效的内存。
  • sizeof 不是函数。它是一个一元运算符。
  • @GauravSehgal - 不,这不是 UB。
  • @StoryTeller 谢谢。从here 清除它。

标签: c++ c sizeof


【解决方案1】:

我使用 gcc 编译器在 C 中尝试了这段代码,这给了我结构本身的大小

应该如此。一元 sizeof 运算符的参数可以是表达式或带括号的类型名称。 C 中的所有表达式都有一个类型。 sizeof 的意思是查看表达式将计算为的类型,并给出该类型的大小。

由于*ptrstruct sample 类型的表达式,结果应该是struct sample 的大小。还值得一提的是,通常表达式甚至不需要计算,大小可以静态确定(除非您正在处理 VLA)。

您可以依赖这种行为,因为这是 C 标准指定它应该做的事情。它总是给出结构的大小。您不能依赖编译器之间的大小相同,但您可以确定 sizeof 的行为。

由于您自己的示例使用指针,因此在"Do I cast the result of malloc?" 中描述了此行为可能有用的一个地方,您将在其中向malloc 提供取消引用指针的大小,而不是类型:

struct sample * ptr = malloc(sizeof *ptr);

理由是您不需要重复类型名称两次(在 C++ 中重复三次,您还需要一次强制转换),从而帮助您避免重构时可能出现的细微错误。

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多