我正在寻找一种方法来在C中找到数组的大小,而不使用sizeofC语言,我找到了以下代码:
int main ()
{
int arr[100];
printf ("%d\n", (&arr)[1] - arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以请你解释一下它是如何工作的?
Ric*_*dle 24
&arr是一个指向100 int秒数组的指针.
的[1]意思是"添加的被指向事物的尺寸",它是100的阵列int秒.
所以之间的差异(&arr)[1],并arr为100 int秒.
(请注意,此技巧仅适用于sizeof无论如何都会工作的地方.)
Ale*_*nze 12
&arr给你一个指向数组的指针.(&arr)[1]相当于*(&arr + 1).&arr + 1给你一个指向后面100个int数组的指针arr.取消引用它*会为您提供后面的数组.由于此数组用于加法表达式(-),因此它衰减到指向其第一个元素的指针.同样的情况,以arr在表达.所以你减去指针,一个指向不存在的元素arr,另一个指向第一个元素arr.这给你100.
但它不起作用.%d用于int.指针差异会返回您,ptrdiff_t而不是int.您需要使用%td的ptrdiff_t.如果你对printf()你传递给它的参数的类型撒谎,你会得到当之无愧的未定义行为.
编辑:(&arr)[1] 可能会导致未定义的行为.这还不完全清楚.如果有兴趣,请参阅下面的评论.