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

C++ 无论是否初始化,使用sizeof(p[0])真的无害吗?,c++,sizeof,C++,Sizeof,我在和我的一个朋友争论,如果我们定义了一个数组/指针: sometype * p; 如果我们想知道字体的大小,他说应该使用: sizeof(sometype) 我说你也可以用: sizeof(p[0]), 应该是一样的。他不同意,他的观点是如果p没有初始化,那么p[0]的这种用法可能会导致问题 但据我所知,只有当我们改变或依赖p[0]的值时,这才是有害的。由于我们既不更改p[0]也不使用p[0]的值,这是完全合理的 既然我们不能互相说服,谁能把这个概念讲清楚呢 我知道这个问题没有用,几乎所

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

sometype * p;
如果我们想知道字体的大小,他说应该使用:

sizeof(sometype)
我说你也可以用:

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

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

既然我们不能互相说服,谁能把这个概念讲清楚呢

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

====================================================
让我把这个问题扩大一点。如果我使用了一些不相关的值(或者被认为是随机的或者其他的)。我是否可以始终使用
p[0]
获取值

为了让问题更清楚,如果我不更改未初始化指针的值,只需使用它所指向的值,我是否总能在不引起问题的情况下获得一个值?

sizeof
是这样的,内存是否初始化无关紧要,因为这是运行时的事情


因此,
sizeof p[0]
或者-我认为更棒的是,它看起来不像数组-sizeof*p是一种很好的方法,可以避免在使用
sizeof

sizeof()时再次键入类型,编译器会对其进行评估,因此,未初始化的变量不是问题。

sizeof的参数是未赋值的操作数,因此指针取消引用等不必引用有效内存。它完全基于类型信息


(作为一个推论,<代码> sieOS*P<代码>不是多态的,它只使用静态类型)

< P>在C++语言中,<>代码> sisiOb/<代码>的参数永远不被评估,这意味着在参数表达式中使用的变量是否保持有效值是完全不相关的。只有
sizeof
下的表达式的静态类型才重要,它是在编译时确定的

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


<>在C中,参数表达式可以在某些情况下(可变长度数组)进行评估,但在C++中没有。真可惜。我喜欢火腿
sizeof p[0]
(或
sizeof*p
)实际上更安全,因为您可能会更改
p
的类型,但忘记更改
sizeof
语句。哈哈,我真的说了hamless吗?如果是的话,很抱歉我的打字错误。有趣的问题,有趣的打字错误。@NikosC当我建议使用
malloc(sizeof*p)
而不是
malloc(sizeof T)
时,我仍然经常被拒绝。关于VLA,这一点很好,但我认为它只会使用声明中的大小表达式,仍然不会计算操作数?@Ben Voigt:,该语言表示表达式是经过计算的,这意味着在
int n=5的情况下,i=0;INTA[n][n];a[i++]的大小我希望
I
得到递增。这是C99中有趣的琐事。可惜我不能再+1了。@BenVoigt+1在你的两个答案上=P