C 指向数组最后一个元素的指针

Rau*_*șcu 2 c arrays pointers sizeof

假设我们有一个数组

int a[4];

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

任何人都知道它是如何完成的?

谢谢一堆!

Vla*_*cow 7

我可以建议以下解决方案

#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;
}
Run Code Online (Sandbox Code Playgroud)

程序输出是

*p = 3
Run Code Online (Sandbox Code Playgroud)

  • 注意:`int*` 强制转换似乎符合“指向对象类型的指针可能会转换为指向不同对象类型的指针。如果结果指针与引用类型没有正确对齐,则行为未定义。” C11 §6.3.2.3 7. (2认同)

M.M*_*M.M 5

你可能正在考虑一些涉及的事情 &a + 1,它是指向结构末尾之后的内存的指针。

但是,(&a)[1][-1],或相同的表达式,但用指针表示法代替数组表示法,*(&a + 1))[-1]*(*(&a + 1) - 1),在技术上是未定义的行为。但是有人可能会将此写成“聪明的把戏”,却没有意识到它是未定义的。

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