在C中不使用sizeof查找数组的大小

poo*_*ank 16 c arrays sizeof

我正在寻找一种方法来在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无论如何都会工作的地方.)

  • `[1]`并不意味着"添加指向的东西的大小".它意味着"添加指向的东西的大小,然后取消引用结果指针". (8认同)

Ale*_*nze 12

&arr给你一个指向数组的指针.(&arr)[1]相当于*(&arr + 1).&arr + 1给你一个指向后面100个int数组的指针arr.取消引用它*会为您提供后面的数组.由于此数组用于加法表达式(-),因此它衰减到指向其第一个元素的指针.同样的情况,以arr在表达.所以你减去指针,一个指向不存在的元素arr,另一个指向第一个元素arr.这给你100.

但它不起作用.%d用于int.指针差异会返回您,ptrdiff_t而不是int.您需要使用%tdptrdiff_t.如果你对printf()你传递给它的参数的类型撒谎,你会得到当之无愧的未定义行为.

编辑:(&arr)[1] 可能会导致未定义的行为.这还不完全清楚.如果有兴趣,请参阅下面的评论.

  • 不是`(&arr)[1] - arr`也是未定义的行为? (2认同)
  • @DanielFischer C99:加法运算符:`为了这些运算符的目的,指向不是数组元素的对象的指针与指向对象类型的长度为1的数组的第一个元素的指针的行为相同作为它的元素类型.所以,看起来这样就可以了.我的意思是'[1]`部分.剩下的就像往常一样. (2认同)
  • @AlexeyFrunze但我们没有`*(&E)`,我们有`*(&E + 1)`. (2认同)