4

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

sometype * p;

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

sizeof(sometype)

我说也可以使用:

sizeof(p[0]),

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

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

既然无法说服对方,谁能把这个概念说清楚。

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

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

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

4

4 回答 4

10

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

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

于 2012-12-26T15:58:11.147 回答
8

sizeof在编译时进行评估,因此无论是否初始化内存都无关紧要,因为这是运行时的事情。

所以sizeof p[0]or - 我认为更好,因为它看起来不像数组 -sizeof *p是避免在使用sizeof.

于 2012-12-26T15:57:00.107 回答
7

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

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

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

于 2012-12-26T16:00:11.863 回答
2

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

于 2012-12-26T15:57:12.993 回答