让我们说我们有一个数组
int a[4];
有一个巧妙的技巧,使用指针算术来找到最后一个元素。据我所知,它使用了'a'的地址并递增它,以便它会在数组之后立即指向然后返回一个位置。
增量背后的想法是有一个隐含的sizeof
被完成。没有任何明确的sizeof
。
任何人都知道它是如何完成的?
非常感谢!
答案 0 :(得分:3)
我可以建议以下解决方案
#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
答案 1 :(得分:3)
您可能正在考虑涉及&a + 1
的内容,它是指向结构末尾的内存的指针。
但是,(&a)[1][-1]
或相同的表达式,但用数字表示法*(&a + 1))[-1]
或*(*(&a + 1) - 1)
替换指针表示法,是technically undefined behaviour。但是有人可能会把它写成一个“聪明的伎俩”而没有意识到它是未定义的。
((int *)(&a + 1))[-1]
定义明确并完成了工作,虽然可以说比阅读直接代码更难阅读。