开发者社区 问答 正文

这段代码如何在不使用sizeof()的情况下确定数组大小?

通过一些C面试问题,我找到了一个问题,指出“如何在不使用sizeof运算符的情况下在C中查找数组的大小?”,并提供以下解决方案。它有效,但是我不明白为什么。

#include <stdio.h>

int main() { int a[] = {100, 200, 300, 400, 500}; int size = 0;

size = *(&a + 1) - a;
printf("%d\n", size);

return 0;

} 如预期的那样,它返回5。

编辑:人们指出了这个答案,但是语法确实有所不同,即索引方法

size = (&arr)[1] - arr; 因此,我认为这两个问题都是有效的,并且对该问题的处理方式略有不同。谢谢大家的大力帮助和详尽的解释! 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-07 01:23:45 338 分享 版权
1 条回答
写回答
取消 提交回答
  • 这条线是最重要的:

    size = *(&a + 1) - a; 如您所见,它首先获取地址a并为其添加一个。然后,它取消引用该指针并a从中减去其原始值。

    C语言中的指针算术使它返回数组或中元素的数量5。加1和&a是指向int之后5 秒的下一个数组的指针a。之后,此代码取消对结果指针的引用a,并从中减去(已衰减为指针的数组类型),从而得出数组中的元素数。

    有关指针算法工作原理的详细信息:

    假设你有一个指针xyz,它指向的int类型和包含的价值(int *)160。当从中减去任何数字时xyz,C表示从中减去的实际数量xyz是该数字乘以它所指向的类型的大小。例如,如果5从中减去xyz,则xyz结果的值将是xyz - (sizeof(*xyz) * 5)指针算术不适用的情况。

    由于a是阵列5 int类型,得到的值将是5。然而,这与一个指针,只以与阵列将无法工作。如果您使用指针尝试此操作,结果将始终为1。

    这是一个小示例,显示了地址以及地址的不确定性。左侧显示地址:

    a + 0 | [a[0]] | &a points to this a + 1 | [a[1]] a + 2 | [a[2]] a + 3 | [a[3]] a + 4 | [a[4]] | end of array a + 5 | [a[5]] | &a+1 points to this; accessing past array when dereferenced 这意味着代码正在a从中减去&a[5](或a+5),得到5。

    请注意,这是未定义的行为,在任何情况下都不应使用。不要期望此行为在所有平台上都一致,也不要在生产程序中使用它。

    2020-02-07 01:24:10
    赞同 展开评论
问答分类:
问答地址: