【问题标题】:C pointer to last element of array指向数组最后一个元素的 C 指针
【发布时间】:2017-12-17 00:08:52
【问题描述】:

假设我们有一个数组

int a[4];

使用指针算法找到最后一个元素有一个巧妙的技巧。据我所知,它正在使用“a”的地址并将其递增,以便它会立即指向数组之后,然后返回一个位置。 递增背后的想法是隐含的sizeof 正在完成。没有任何明确的sizeof。

有人知道它是怎么做的吗?

非常感谢!

【问题讨论】:

  • 可能类似于*(&a + 1) - 1(未检查/测试,我怀疑这是明确定义的)
  • 查看我的问题:Is *((*(&array + 1)) - 1) safe to use to get the last element of an automatic array?。简而言之,*(&array + 1) 调用 UB。
  • 不清楚你的意思。没有“技巧”。 (无论如何,“技巧”在大多数时候都是个坏主意。)
  • @M.M (int *)(&a + 1) 转换有效吗?指针类型不兼容,我认为...
  • 是否有充分的理由避免使用sizeof()?还是纯粹的学术问题?

标签: c arrays pointers sizeof


【解决方案1】:

我可以建议以下解决方案

#include <stdio.h>

int main( void )
{
    int a[4] = { 0, 1, 2, 3, };

    int *p = (int *)(&a + 1) - 1;

    printf("*p = %d\n", *p);

    return 0;
}

程序输出是

*p = 3

【讨论】:

  • 注意:int* 强制转换似乎可以根据“指向对象类型的指针可能会转换为指向不同对象类型的指针。如果生成的指针未正确对齐引用的类型,行为未定义。” C11 §6.3.2.3 7.
【解决方案2】:

您可能正在考虑涉及&amp;a + 1 的东西,它是一个指向刚刚超过结构末尾的内存的指针。

但是,(&amp;a)[1][-1] 或相同的表达式,但用指针表示法代替数组表示法,*(&amp;a + 1))[-1] 或 *(*(&amp;a + 1) - 1),是 technically undefined behaviour。但有人可能把它写成一个“聪明的把戏”,没有意识到它是未定义的。

((int *)(&amp;a + 1))[-1] 定义明确并且可以胜任工作,尽管可以说比编写简单的代码更难阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多