让我们考虑以下代码:
Core.Entities.Filter InitializeFilter() =>
NavigationListener.Instance.RequestFilter += OnRequestFilter;
void OnRequestFilter()
{
using (var alert = new AlertDialog.Builder(this))
{
alert.SetView(LayoutInflater.Inflate(Resource.Layout.Filter, null));
var dialog = alert.Create();
dialog.SetTitle("Filters");
dialog.CancelEvent += (s, e) =>
{
var dateSubmitted = OnDateSubmittedFilterSet();
var engagementFee = OnEngagementFeeFilterSet();
_filter = new Core.Entities.Filter(dateSubmitted, engagementFee);
};
dialog.Show();
}
}
输出:
#include <stdlib.h>
#include <stdio.h>
struct B
{
int a;
};
struct B* func(int size, struct B a[static size])
{
printf("sizeof a=%lu\n", sizeof a);
return malloc(sizeof a);
}
int main()
{
struct B a[12];
struct B* c = func(12, a);
int s = 12;
struct B x[s];
printf("sizeof x=%lu\n", sizeof x);
free(c);
}
现在,如果我知道,C99标准(http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)中的以下内容仍然有效:
6.5.3.4/2
sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。大小由操作数的类型确定。结果是整数。如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是整数常量。
和
6.7.5.3函数声明符(包括原型)
7参数声明为''类型数组''应调整为''限定指向类型'',其中类型限定符(如果有)是在数组类型的[和]中指定的那些推导。如果关键字static也出现在数组类型派生的[和]中,则对于每次对函数的调用,相应实际参数的值应提供对数组的第一个元素的访问,其中至少有指定的元素数量。按大小表达式。
如果我不误解了我的代码或两个标准提取中的内容,sizeof a=8
sizeof x=48
a
参数是一个可变大小的数组,长度为12,持有func
结构,每个结构都有B
(在我的平台上4个字节)所以我原以为int
将是12 * 4,
但似乎无论静态大小说明符如何,编译器都将其视为指针(Difference between passing array and array pointer into function in C)。
现在问题出现了:
我是否误解了标准,无论静态大小说明符,数组仍作为指针传入?