我发现了一个非常相似的问题,但我认为答案没有分析漏洞。请参阅: Is `*((*(&array + 1)) - 1)` safe to use to get the last element of an automatic array?
我知道通常的方法是计算
sizeof(array)/sizeof(*array)
来获取数组中元素的数量。(并且有人在评论中指出C++有std::size(array)
。)因此,我认为如果我能够到达最后一个元素之后的地址,那么这个数字可以通过指针数学运算计算出来。但是,然后我想到我可以:
&array + 1
但是,这个值的类型是指向数组的指针,因此为了让数学计算起作用,我需要对这个值进行解引用。
const auto N = *(&array + 1) - array;
在C和C++中是否有一种允许这种解引用合法的津贴?
我知道你可以指向数组的最后一个元素,但是你不允许对其进行解引用。然而,这个解引用产生了一个数组对象,它立即衰减为指向其第一个元素的指针。
我可以使用reinterpret_cast
来避免使用解引用运算符,但我想知道C和/或C++语言是否允许在这种情况下使用解引用。
†我错过了一个类似的问题,但这个问题有些微妙的不同。我已经理解了代码的工作原理,并且我知道在数组的最后一个元素之后解引用指针通常会出现问题。我想知道数组对象在表达式中使用时会衰减为指针的事实是否允许例外。我认为可能会,因为解引用指向对象的指针通常会导致使用对象值本身在表达式中(如果对象不存在,则会出现问题)。