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

vc6uscn9  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(139)

假设我们有一个数组
int a[4];
有一个巧妙的技巧,使用指针算术来找到最后一个元素。据我所知,它使用了'a'的地址并递增它,以便它将立即指向数组之后,然后返回一个位置。增量背后的想法是,有一个隐式的sizeof正在完成。没有任何明确的sizeof
有人知道是怎么做到的吗?
多谢了!

qhhrdooz

qhhrdooz1#

我可以提出以下解决方案

#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
n1bvdmb6

n1bvdmb62#

你可能会想到一些涉及&a + 1的东西,它是一个指向结构体末尾后面的内存的指针。
然而,(&a)[1][-1],或相同的表达式,但用指针表示法代替数组表示法,*(&a + 1))[-1]*(*(&a + 1) - 1),是technically undefined behaviour。但是有人可能会把它写成一个“聪明的技巧”,而没有意识到它是未定义的。
((int *)(&a + 1))[-1]是定义良好的,并且完成了这项工作,尽管可以说比编写简单的代码更难阅读。

相关问题