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

使用`*((*(&array+1))-1)`获取自动数组的最后一个元素是否安全?

郝昊东
2023-03-14

假设我想获取一个大小未知的自动数组的最后一个元素。我知道我可以利用sizeof运算符来获得数组的大小,并相应地获得最后一个元素。

使用*((*(&array+1))-1)安全吗?

如:

char array[SOME_SIZE] = { ... };
printf("Last element = %c", *((*(&array + 1)) - 1));
int array[SOME_SIZE] = { ... };
printf("Last element = %d", *((*(&array + 1)) - 1));

ETC

共有1个答案

鲍建业
2023-03-14

我相信这是没有定义的行为,因为彼得在他的回答中提到的原因。

关于*(&array+1)有一个很大的争论。一方面,取消引用&array+1似乎是合法的,因为它只是将类型从T(*)[]改回T[];但另一方面,它仍然是指向未初始化、未使用和未分配内存的指针。

我的答案有以下几点:

由于&array不是指向作为数组元素的对象的指针,那么根据这一点,就意味着代码相当于:

char array_equiv[1][SOME_SIZE] = { ... };
/* ... */
printf("Last element = %c", *((*(&array_equiv[0] + 1)) - 1));

也就是说,&array是指向由10个字符组成的数组的指针,因此它的行为与指向长度为1的数组的第一个元素的指针相同,其中每个元素都是由10个字符组成的数组。

现在,连同后面的从句(在其他答案中已经提到过;这段确切的摘录是公然从Ameycu的答案中盗取的):

C99第6.5.6.8节-

[...]
如果表达式P指向数组对象的最后一个元素,则html" target="_blank">表达式(P)+1指向[...]
如果结果指向数组对象的最后一个元素,则不应将其用作求值的一元*运算符的操作数。

是的,在现实世界中,它可能起作用,因为在现实中,原始代码并不真正取消对内存位置的引用,它主要是从t(*)[]t[]的类型转换,但我非常肯定,从严格的标准遵从性的观点来看,它是未定义的行为。

 类似资料:
  • 本文向大家介绍js获取数组的最后一个元素,包括了js获取数组的最后一个元素的使用技巧和注意事项,需要的朋友参考一下 在js里面如何获取一个数组的最后一个元素呢?这里总结了两种方法,有需要的朋友可以看看。 (1)js内置pop方法 pop() 方法用于删除并返回数组的最后一个元素,注意这里在获取了数组的最后一个元素的同时也将原数组的最后一个元素给删除了。如果数组已经为空,则该方法不改变数组,并返回

  • 返回数组中的最后一个元素。 使用 arr.length - 1 来计算给定数组的最后一个元素的索引并返回。 const last = arr => arr[arr.length - 1]; last([1, 2, 3]); // 3

  • 问题内容: 整数数组包含一些元素,以使每个元素比其前一个元素多1个或小于1个。现在给了一个数字,我们需要确定该数字在数组中首次出现的索引。需要优化线性搜索。它不是功课。 问题答案: 我的算法是这样的: p = 0 如果(A [p] == x)则idx = p并且算法完成,否则转到下一步 设置p + = | xA [p] | 转到2。 说A [p]> x。然后,由于A项增加或减少1,因此idx至少可

  • rank ▲ ✰ vote url 61 374 45 700 url 获取列表最后一个元素 在Python里,如何获取一个列表的最后一个元素? some_list[-1]最短最Pythonic的方法. 事实上你可以用这个语法做好多事.some_list[-n]语法获取倒数第n个元素.所以some_list[-1]获取最后一个元素,some_list[-2]获取倒数第二个,等等.最后some_li

  • 问题内容: 我正在使用String split方法,并且我想拥有最后一个元素。数组的大小可以更改。 例: 我想分割上面的字符串并得到最后一个项目: 我不知道在运行时数组的大小:( 问题答案: 将数组保存在局部变量中,并使用数组的字段查找其长度。减去1以说明它是基于0的: 注意:如果原始字符串仅由分隔符组成,例如或,则为0,这将引发ArrayIndexOutOfBoundsException。示例:

  • 我试图写一个函数来找出数组(1D)中任意2个元素之间的最大差异。我已经用几种方法解决了它(我在Java中应用) 具有2个嵌套循环(工作、查找差异并取最大值) 进行1次循环迭代(工作,在返回最小值和最大值的差值:(max-min)) 两次使用stream(工作,用stream的min()和max()函数查找最大值和最小值,并返回差异)。