假设我们有一个数组int a[4];有一个巧妙的技巧,使用指针算术来找到最后一个元素。据我所知,它使用了'a'的地址并递增它,以便它将立即指向数组之后,然后返回一个位置。增量背后的想法是,有一个隐式的sizeof正在完成。没有任何明确的sizeof。有人知道是怎么做到的吗?多谢了!
int a[4];
sizeof
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
n1bvdmb62#
你可能会想到一些涉及&a + 1的东西,它是一个指向结构体末尾后面的内存的指针。然而,(&a)[1][-1],或相同的表达式,但用指针表示法代替数组表示法,*(&a + 1))[-1]或*(*(&a + 1) - 1),是technically undefined behaviour。但是有人可能会把它写成一个“聪明的技巧”,而没有意识到它是未定义的。((int *)(&a + 1))[-1]是定义良好的,并且完成了这项工作,尽管可以说比编写简单的代码更难阅读。
&a + 1
(&a)[1][-1]
*(&a + 1))[-1]
*(*(&a + 1) - 1)
((int *)(&a + 1))[-1]
2条答案
按热度按时间qhhrdooz1#
我可以提出以下解决方案
程序输出为
n1bvdmb62#
你可能会想到一些涉及
&a + 1
的东西,它是一个指向结构体末尾后面的内存的指针。然而,
(&a)[1][-1]
,或相同的表达式,但用指针表示法代替数组表示法,*(&a + 1))[-1]
或*(*(&a + 1) - 1)
,是technically undefined behaviour。但是有人可能会把它写成一个“聪明的技巧”,而没有意识到它是未定义的。((int *)(&a + 1))[-1]
是定义良好的,并且完成了这项工作,尽管可以说比编写简单的代码更难阅读。