【问题标题】:Is it really harmless to use sizeof(p[0]) no matter initialized or not?无论是否初始化,使用 sizeof(p[0]) 真的无害吗?
【发布时间】:2012-12-12 03:34:24
【问题描述】:

我在和我的一个朋友争论,如果我们定义了一个数组/指针:

sometype * p;

如果我们想知道类型的大小,他说应该使用:

sizeof(sometype)

我说也可以使用:

sizeof(p[0]),

应该是一样的。他不同意,他的观点是如果p没有初始化,那么p[0]的这种用法可能会导致问题。

但据我所知,只有当我们改变或依赖p[0] 的值时,这才会有害。由于我们不更改p[0] 也不使用p[0] 的值,这是完全明智的。

既然不能互相说服,谁能把这个概念说清楚。

我知道这个问题没有用,几乎所有的开发者都会使用 sizeof(sometype),包括我:)。但是这个问题很有趣,我真的很想知道 sizeof(p[0]) 是否会有害。

==================================
让我稍微扩展一下这个问题。如果我确实使用了一些不相关的值(或被认为是随机的或其他的)。我可以始终使用p[0] 来获取值吗?

为了让问题更清楚,如果我不更改未初始化指针的值,只使用它所指向的值,我是否可以始终获得一个值而不会造成问题?

【问题讨论】:

  • 无耻?真可惜。我爱火腿!
  • sizeof p[0](或sizeof *p)实际上更安全,因为您可能会更改p 的类型但忘记更改sizeof 语句。
  • 大声笑,我真的说无赖吗?如果我这样做了,那么对错字感到抱歉。有趣的问题,有趣的拼写错误。
  • @NikosC 当我建议使用 malloc(sizeof *p) 而不是 malloc(sizeof T)...

标签: c++ sizeof


【解决方案1】:

sizeof 的参数是一个未计算的操作数,因此指针解引用等不必引用有效内存。它完全基于类型信息。

(作为推论,sizeof *p 不是多态的,它只使用静态类型。)

【讨论】:

    【解决方案2】:

    sizeofevaluated at compile-time,因此内存是否初始化并不重要,因为这是运行时的事情。

    所以 sizeof p[0] 或 - 我认为更好,因为它看起来不像数组 - sizeof *p 是避免在使用 sizeof 时再次输入类型的好方法。

    【讨论】:

      【解决方案3】:

      在 C++ 语言中,sizeof 的参数永远不会被计算,这意味着参数表达式中使用的变量是否保持有效值是完全不相关的。只有sizeof下的表达式的静态类型很重要,在编译时确定。

      此外,实际上最好使用表达式(而不是类型名称)作为sizeof 的参数,以使代码更加独立于类型。

      在 C 中,参数表达式可能会在某些情况下进行计算(可变长度数组),但在 C++ 中则不然。

      【讨论】:

      • 关于 VLA 的好点,但我认为它只会使用声明中的大小表达式,而不是评估操作数?
      • @Ben Voigt:嗯,语言说表达式是evaluated,这意味着在int n = 5, i = 0; int a[n][n]; sizeof a[i++]; 的情况下,我希望i 增加。跨度>
      • 有趣的 C99 琐事,那个。太糟糕了,我不能再 +1。
      • @BenVoigt 在你的两个答案中 +1 =P
      【解决方案4】:

      sizeof() 由编译器评估,因此未初始化的变量不是问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-14
        • 2020-02-18
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多