【发布时间】:2019-10-02 21:29:06
【问题描述】:
通过一些 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。
编辑:人们指出this的答案,但语法确实有点不同,即索引方法
size = (&arr)[1] - arr;
所以我相信这两个问题都是有效的,并且解决问题的方法略有不同。感谢大家的大力帮助和详尽的解释!
【问题讨论】:
-
嗯,找不到,但严格来说好像是。 Annex J.2 明确指出:一元 * 运算符的操作数具有无效值 是未定义的行为。这里
&a + 1没有指向任何有效的对象,所以是无效的。 -
相关:Is
*((*(&array + 1)) - 1)safe to use to get the last element of an automatic array?。 tl;dr*(&a + 1)调用未定义的行为 -
@AlmaDo 语法确实有点不同,即索引部分,所以我相信这个问题本身仍然有效,但我可能错了。感谢您指出!
-
@janojlicz 它们本质上是相同的,因为
(ptr)[x]与*((ptr) + x)相同。
标签: c arrays size language-lawyer pointer-arithmetic