关于函数中的sizeof及其可变长度数组参数

时间:2016-07-06 13:16:09

标签: c arrays pointers

让我们考虑以下代码:

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)。

现在问题出现了:

我是否误解了标准,无论静态大小说明符,数组仍作为指针传入?

0 个答案:

没有答案