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

Rai*_*Sia 4 c++ sizeof

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

sometype * p;
Run Code Online (Sandbox Code Playgroud)

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

sizeof(sometype)
Run Code Online (Sandbox Code Playgroud)

我说过一个人也可以用:

sizeof(p[0]),
Run Code Online (Sandbox Code Playgroud)

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

但据我所知,只有当我们改变或依赖其价值时p[0],这才是有害的.既然我们不改变p[0]也不p[0]使用价值,这是完全合情合理的.

既然我们不能说服对方,任何人都可以清楚地说明这个概念.

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

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

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

Ben*_*igt 10

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

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


Thi*_*ter 8

sizeof在编译时进行计算,因此也无所谓内存是否已初始化与否,因为这是一个运行时的事情.

所以sizeof p[0]或者 - 我认为甚至更好,因为它看起来不是阵列 - sizeof *p是一种避免在使用时再次输入类型的好方法sizeof.


AnT*_*AnT 7

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

而且,实际上最好使用表达式(而不是类型名称)作为sizeof使代码更加类型无关的参数.

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