我们不能初始化自动数组变量吗?

时间:2015-10-08 16:05:34

标签: c

我指的是Gottfried的书"Theory and Problems of Programming with C"(Schaum的纲要系列,第2版,1996)。 在关于阵列的第9章第243页第9.1节中,它说:

  

与自动变量不同,自动数组无法初始化。但是,外部和静态数组定义可以包括在需要时分配初始值。

我不明白这个突出声明的含义。我试图在函数内初始化数组(有和没有auto关键字)并且没有看到任何问题。

void func1 (void)
{
    auto int array1[5] ={1,0,4,1,5};
    charVar1='M';
    printf("%d", *(array1+4));
}

添加了页面enter image description here

的图片

3 个答案:

答案 0 :(得分:3)

回答第一部分

  

与自动变量不同,自动数组无法初始化

假设“自动数组”实际上是“自动存储持续时间的数组数据结构,其长度在运行时确定”

是的,这里所谓的是variable length array。它不能像简单逻辑那样初始化,大小是在运行时确定的。

引用C11标准,章节§6.7.9,初始化(强调我的)

  

要初始化的实体的类型应为未知大小的数组或不是可变长度数组类型的完整对象类型。

否则,对于没有任何存储类说明符的局部变量,默认为auto和非VLA类型的自动数组可以初始化,当然。

答案 1 :(得分:2)

鉴于这本书相当古老,没有发明VLA和复合文字的概念。

自动变量是局部变量的正式术语。甚至还有关键字auto,但它是该语言中最多余的关键字之一,因为所有局部变量都隐式声明为auto。那就是:

{
  auto int x = 1;
}

{
  int x = 1;
}

是100%等效,auto关键字不添加任何内容(所以没有人使用前一种风格)。

因此,通过术语自动数组,作者可能只是简单地引用了本地数组。正如我们从问题中的示例中看到的那样,您可以很好地初始化此类数组。这本书不正确和/或使用错误的术语。

该书的作者似乎总体上感到困惑:"初始值的分配"是初始化的C定义。形式定义可以在6.7.8的C标准语法中找到,其中"赋值表达式"是初始化的有效形式之一。

我建议找另一本书,最好是涵盖最新C标准C99和C11的书。

答案 2 :(得分:1)

该声明实际上是错误的琐碎演示(与例如数组初始化是常见但非标准的扩展相反):

void doSomethingWithArray(size_t sz, int arr[static sz]);

int main(void) {
    doSomethingWithArray(5,
        (int[]){ 1, 2, 3, 4, 5 }
    );
}

创建一个匿名数组,其自动存储持续时间在main范围内。由于它是匿名的,因此main中的代码无法引用它来设置元素值。将值放入此特定自动数组的 only 方法是通过初始化。因此,此功能 - 能够初始化自动阵列 - 是合法,标准和必要的。

QED。