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

Can';我们不能初始化自动数组变量吗?,c,C,我指的是Gottfried的书(Schaum的大纲系列,第二版,1996年)。 在第9章关于阵列的第243页第9.1节中,它说: 与自动变量不同,自动数组不能初始化。但是,如果需要,外部和静态数组定义可以包括初始值的赋值 我不明白这句话的意思。我尝试在函数中初始化数组(有和没有auto关键字),但没有发现任何问题 void func1 (void) { auto int array1[5] ={1,0,4,1,5}; charVar1='M'; printf("%d",

我指的是Gottfried的书(Schaum的大纲系列,第二版,1996年)。 在第9章关于阵列的第243页第9.1节中,它说:

与自动变量不同,自动数组不能初始化。但是,如果需要,外部和静态数组定义可以包括初始值的赋值

我不明白这句话的意思。我尝试在函数中初始化数组(有和没有
auto
关键字),但没有发现任何问题

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

添加页面图像以回答第一部分

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

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

是的,这里所指的是a。它无法初始化,因为对于简单逻辑,大小是在运行时确定的

引用
C11
标准,第§6.7.9章,初始化(重点)

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


否则,对于没有任何存储类说明符的局部变量,默认为
auto
,并且非VLA类型的自动数组,可以被初始化,这是肯定的。

该语句实际上是错误的简单证明(例如,数组初始化是一个常见但非标准的扩展):

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


QED.

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

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

{
  auto int x = 1;
}

是100%等价的,自动关键字不添加任何内容(因此没有人使用前一种样式)

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

这本书的作者似乎总的来说很困惑:“初始值的赋值”正是C语言对初始化的定义。正式定义可以在6.7.8的C标准语法中找到,其中“赋值表达式”是初始化的有效形式之一


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

自动阵列?它是VLA吗?
外部和静态的定义可以包括
…这是正确的吗?我不认为作者谈论VLA。我所拥有的早期版本之一是1991年的版本,甚至可以看到这句话。他主要谈论自动数组变量。
auto
是隐式的,这就是为什么不管你是否自己编写它都无关紧要。无法初始化语句自动数组。这是不正确的。然而,考虑到引用的其余部分是断章取义的英语,我怀疑您复制错误。曾经有一段时间您无法初始化自动数组。那是很久以前的事了,在另一个千年里。AFAICS,甚至C89标准也允许对自动阵列进行初始化(§6.5.7初始化);GCC支持使用
-std=c89-pedantic
编译显示的代码。当然,C99和C11都允许这样做。因此,您的书描述了C的一个古老版本,应该谨慎对待。你应该计划永远不要在你的C代码中使用
auto
;使用它没有任何好处。(如果您最终使用C++11或更高版本进行编码,您将使用
auto
,但这是非常不同的!)复制的部分中没有任何内容表明它在谈论VLAs。这个部分完全错了。如果我没有弄错的话,C11是在C99之后出现的,C99是在1999年发布的。但我随身携带的这位作者的一本书是1991年版,我不确定当时是否有VLA功能。或者用原版C怎么办?是否不允许自动数组变量初始化?大部分作者都是错的。@JonWheelock我没有那本书的副本,但是如果它说在编译时具有固定大小的数组和自动存储无法初始化,那么,是的,语句是错的。这本书是1996年出版的,因此使用C99的示例并没有真正说明书中的错误。这本书最迟也会谈到C90。
{
  auto int x = 1;
}
{
  int x = 1;
}