当前位置: 首页 > 知识库问答 >
问题:

获取数组长度的指针数学[duplicate]

商运锋
2023-03-14

我发现这个问题几乎是一个精确的重复,但我认为答案没有分析出漏洞。参见:`*((*(&array+1))-1)`用于获取自动数组的最后一个元素是否安全?

我知道通常的方法是计算sizeof(array)/sizeof(*array)来得到数组中的元素数量。(在注释中已经向我指出C++有std::size(array))

所以,我推论,如果我能通过最后一个元素找到1的地址,就可以用指针数学来计算这个数字。但是,后来我想到我可以:

&array + 1
const auto N = *(&array + 1) - array;

在C和C++中是否有允许这种取消引用是合法的?

我知道允许您指向数组最后一个元素以外的一个,但不允许您取消对它的引用。但是,这个取消引用产生一个数组对象,该对象立即衰减为指向其第一个元素的指针。

我可以使用reinterpret_cast来避免使用取消引用运算符,但我想知道C和/或C++语言在这种情况下是否允许取消引用。

我错过了一个类似的问题,但这个问题有微妙的不同。我已经理解了代码的工作原理,并且理解在数组的最后一个元素之前取消引用指针通常会有问题。我想问的是,数组对象在表达式中使用时会衰减为指针这一事实是否允许出现异常。我认为这是可能的,因为取消引用指向对象的指针通常会导致在表达式中使用对象值本身(如果对象不存在,这将是一个问题)。

共有1个答案

廉雅惠
2023-03-14

没有。这样做是未定义的行为:

请注意,表达式*(&a+1)会导致未定义的行为:

...

C 2011年在线草稿,6.5.6/9

因此尝试取消对超出界限的内容的引用将导致未定义的行为。没有例外。

编辑:我可能错了。在这个问题上有另一个来源说你可以取消引用它(强调我的):

所以,因为它是过去的指针,(根据作者的说法)可以取消引用它,只是不读或不写。在这种情况下,这不会对您产生影响,因为您正在为其大小属性使用它。

但是,请记住,任何超过1的东西在结束后(与开始相反),这将是不起作用的。

事实上,这是有争议的,甚至可能是委员会本身也有争议的。但我不认为这里的问题与这个问题有少许不同。

 类似资料:
  • 问题内容: 如果不知道该如何获取数组的第二维?仅给出第一维度。 例如,在 如何获得的第二维的值,即3。 谢谢 问题答案: 哪 三个? 您已经创建了一个多维数组。是一个int数组的数组;您有两个长度为三的数组。 会给你第一个数组的长度。 另外值得注意的是,您不必像以前那样初始化多维数组,这意味着所有数组的长度不必相同(或根本不存在)。

  • 主要内容:关于数组指针的谜题数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以 为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个 指针,它指向数组的第 0 个元素。 在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:

  • 本文向大家介绍指针数组、数组指针、函数指针的区别?相关面试题,主要包含被问及指针数组、数组指针、函数指针的区别?时的应答技巧和注意事项,需要的朋友参考一下 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32

  • 我想知道实际上是如何工作的。我认为这是一种计算数组长度的简单方法,并希望在使用它之前适当地理解它。我对指针算术不是很有经验,但根据我的理解,给出了数组第一个元素的地址。将按地址转到数组的末尾。但是不应该给出这个地址的值吗。而是打印出地址。我真的很感激你帮我把指针的东西弄清楚。 下面是我正在研究的一个简单示例:

  • 问题内容: 我需要获取行和列的2D数组的长度。我已经使用以下代码成功完成了此操作: 这将按预期打印出5、10。 现在看一下这一行: 注意,实际上我必须引用特定的行才能获取列的长度。对我来说,这似乎非常丑陋。此外,如果数组定义为: 然后,当尝试获取长度时,代码将失败。有其他方法(更智能)吗? 问题答案: 考虑 每行的列长不同。如果要通过固定大小的2D数组支持某些数据,请在包装器类中为固定值提供吸气剂

  • 我想知道我是否可以自动推断数组的大小,它作为模板参数传递,而不(显式地)传递它的大小。 null