2017-02-15 89 views
7

据我所知,当我们定义一个像const char argv[SIZE];这样的数组时,“SIZE”必须是编译时已知的数字。定义不确定大小的数组

但最近我读了AOSP代码,发现这个:http://androidxref.com/5.1.1_r6/xref/system/netd/server/NetdConstants.cpp#70

static int execIptables(IptablesTarget target, bool silent, va_list args) { 
    /* Read arguments from incoming va_list; we expect the list to be NULL terminated. */ 
    std::list<const char*> argsList; 
    argsList.push_back(NULL); 
    const char* arg; 
    do { 
     arg = va_arg(args, const char *); 
     argsList.push_back(arg); 
    } while (arg); 

    int i = 0; 
    const char* argv[argsList.size()]; 
    ... 

看来const char* argv[argsList.size()];采用了尺寸只在运行时已知的。这是因为这个数组是在一个函数中定义的,它将在堆栈中分配数组,或者因为编译器可以在编译时计算出大小是多少?

+0

一些编译器支持(作为扩展)堆栈上的数组,其大小仅在运行时才知道。 – BoBTFish

+1

作者期待着任何C++编译器构建此代码都支持非标准功能(可变长度数组,VLA)。 – WhozCraig

+3

一个'std :: list'用于累积可变参数然后用来创建一个VLA并将所有内容复制到那里?这个垃圾谁写的?我不想再使用这款手机了... –

回答

0

正确的术语是可变长度阵列(VLA)。

C++语言标准不支持此功能。 C语言标准在某些时候开始支持它。

内存中的分配依赖于编译器(即,不由标准决定)。

+0

您应该指定即使标准C++不支持它,它也是一个常见的扩展(由gcc和clang支持)。 –

+0

@MatteoItalia:好的,好点。我指的是当然的一般标准。你的评论会为我做这件事(因为我不确定其他C++编译器支持这个)。谢谢:) –

+0

海湾合作委员会和铛,但*不* MSVC - 这可能是一个问题,取决于你的目标平台。 –