【发布时间】:2013-04-15 17:47:52
【问题描述】:
在Find size of array without using sizeof 中,数组的大小是通过
int arr[100];
printf ("%td", (&arr)[1] - arr);
现在,出于指针算术的目的,arr 被认为是单元素数组的元素,所以
&arr + 1
是该(概念)单元素数组末尾的指针,因此当减去arr[0]的地址时,得到arr中的元素数。
在(&arr)[1]中,该指针是间接运算符的操作数,
(&arr)[1] ≡ *(&arr + 1)
然后根据 6.3.2.1 (3) 将生成的数组表达式转换为 int*。
到目前为止,一切都很好。但是6.5.6(8)最后一句(加法运算符),
如果结果指向数组对象的最后一个元素,它 不得用作被评估的一元
*运算符的操作数。
禁止在此处评估间接运算符。
问题是间接运算符是否在中求值
*(&arr + 1) - arr
(在这种情况下,该表达式将调用未定义的行为)或数组到指针的转换会取消评估(在这种情况下一切都很好),例如获取地址 (&(*(&arr + 1))) 或对其应用 sizeof会..
【问题讨论】:
-
我知道你在问 C,但是 FWIW,在 C++ 中,这个想法(尚未在标准中正确表达)是行为未定义的左值到右值转换.由于这不会发生,因此此代码将是有效的。
-
*(&arr + 1)是未定义的行为,(&arr)[1]也是如此。我不确定我是否理解您的问题。 -
@ouah 但是取地址或者申请
sizeof会导致*不被评估,那么就没有问题了。问题是数组到指针的转换是否有同样的效果。
标签: c arrays pointers language-lawyer