无论是否初始化,使用sizeof(p [0])真的无害吗?

时间:2012-12-26 15:55:12

标签: c++ sizeof

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

sometype * p;

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

sizeof(sometype)

我说过也可以使用:

sizeof(p[0]),

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

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

由于我们无法说服对方,任何人都可以明确这个概念。

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

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

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

4 个答案:

答案 0 :(得分:10)

sizeof的参数是未评估的操作数,因此指针解引用等不必引用有效的内存。它纯粹基于类型信息。

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

答案 1 :(得分:8)

sizeofevaluated at compile-time因此,无论内存是否已初始化都无关紧要,因为这是运行时的事情。

所以sizeof p[0]或者 - 我觉得它更好看,因为它看起来不是阵列 - sizeof *p是避免在使用sizeof时再次输入类型的好方法。< / p>

答案 2 :(得分:7)

在C ++语言中,永远不会评估sizeof的参数,这意味着参数表达式中使用的变量是否包含有效值完全无关紧要。只有sizeof下表达式的静态类型很重要,并且在编译时确定。

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

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

答案 3 :(得分:2)

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