2017-02-09 60 views
-2

我用 “了funcName 4”非常奇怪的数组声明的问题 - ç

int main(int argc, char** argv) { 
    int numPassedIn = atoi(argv[1]); 
    printf("%d", numPassedIn); 
    pid_t kidPID[numPassedIn]; 

print语句打印 “4” 调用这个函数。说得通。

但是,数组kidPID没有正确初始化(声明?)。没有空间来存储pid_t。

如果我改变代码来读取

int main(int argc, char** argv) { 
    int numPassedIn = atoi(argv[1]); 
    printf("%d", numPassedIn); 
    pid_t kidPID[4]; 

它确实提供了空间。这里发生了什么?提前致谢!

+1

为什么你认为'kidPID'未正确分配呢?使用静态或动态大小,数组将具有相同的属性。第一个版本的问题与第二个版本没有什么关系? (除非你传递参数除外!!) –

+0

变长数组是一个可选的实现,所以你的编译器可能不支持。 –

+0

你怎么知道它没有正确分配? – immibis

回答

2

C允许在运行时确定数组中元素的数量时声明可变长度数组(VLA)。

因此,在此声明

pid_t kidPID[numPassedIn]; 

存在被声明用等于存储在变量numPassedIn值元素的数量的可变长度的数组。如果变量numPassedIn的值等于4,则该声明实际上是(有一些限制)等同于声明

pid_t kidPID[4]; 
+0

现在仅支持向后兼容的可变长度数组。 –

+0

@WeatherVane是否发布了新的C标准草案? –

+0

AFAIK即C11。可选的。在C99中,他们是有史以来最好的事情。显然没有更多。 –