gpt4 book ai didi

c++ - 强制数组衰减(因为没有更好的标题)

转载 作者:行者123 更新时间:2023-12-01 13:46:39 26 4
gpt4 key购买 nike

灵感来自这个问题:How does *(&arr + 1) - arr give the length in elements of array arr?

以下代码将计算数组的长度,尽管调用了未定义的行为:

int  arr[] = {5, 8, 1, 3, 6};
size_t len = *(&arr + 1) - &arr[0]; // len is 5

我相信,通过取消引用 (&arr + 1) 我们正在触发未定义的行为。然而,我们这样做的唯一原因是立即将结果衰减为 int* , 指向原始数组中最后一个元素之后的一个元素。由于我们没有取消引用这个指针,我们在定义的区域中很好。

因此问题如下:有没有办法衰减到 int*不取消引用不可引用的指针并保持定义?

附言强制免责声明:是的,我可以用 sizeof 计算数组的大小运算符和除法。这不是问题的重点。

编辑:
我现在不太确定间接寻址本身是未定义的。我找到了 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232从它看起来似乎有试图使间接本身合法化,但我无法在实际标准中找到任何与此相关的措辞。

最佳答案

所谓的“衰减”是标准语中的“数组到指针的转换”,很明显你问的是不可能的:

[conv.array]

An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”



不可能有 lvalue引用一个不存在的数组,并且一个右值(不是从左值转换而来)不能引用同一个数组。

现在澄清几点:
  • &arr + 1pointer pass the end of an object , 间接是 defined仅在指向实际对象的指针上。活跃的问题是关于空指针,它与指针传递对象的末尾无关。
  • 指针运算只是defined在同一个数组中的对象上,即使你有 int arr[2][5]; , *(&arr + 1)衰减为 int*不被视为数组的一部分 arr[0] ,等等 &arr[1][0] - &arr[0][0]仍然未定义。
  • 关于c++ - 强制数组衰减(因为没有更好的标题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61238781/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com