-2

有人问我这个语法是什么意思:

char data[32] = {1};

但是我不记得它做了什么,。但我记得它是有效的。
谁能解释它的目的?

4

4 回答 4

8

这将创建一个包含 32 个字符的数组。第一个元素将为 1,其余元素将设置为零。

于 2012-08-16T20:14:48.780 回答
7

如果您根本不初始化自动数组(本地而非静态),则数组的元素可能包含垃圾值。

#include <stdio.h>

int main(int argc, char **argv)
{
    int i;
    char data[5];
    for (i = 0; i < 5; i++) {
        printf("data[%d] = %d\n", i, data[i]);
    }
    return 0;
}

输出:

data[0] = 72
data[1] = 12
data[2] = -118
data[3] = 51
data[4] = -119

但是,如果您初始化它,它将使用您指定的初始化程序进行初始化。如果初始化器的数量小于数组中元素的总数,则剩余的元素将被初始化为 0。

#include <stdio.h>

int main(int argc, char **argv)
{
    int i;
    char data[5] = {1};
    for (i = 0; i < 5; i++) {
        printf("data[%d] = %d\n", i, data[i]);
    }
    return 0;
}

输出:

data[0] = 1
data[1] = 0
data[2] = 0
data[3] = 0
data[4] = 0
于 2012-08-16T20:16:55.137 回答
2

是初始化。它将数组的第一个元素设置为1^A在我检查的 ASCII 表中),其余元素设置为0(默认值)。

声明省略初始化器的 C99 标准:

如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。

和:

如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态存储持续时间的对象未显式初始化,则:

  • 如果是指针类型,则初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则每个成员都根据这些规则(递归地)初始化;
  • 如果是联合,则根据这些规则(递归地)初始化第一个命名成员。

Andchar是算术类型,因此数组的其余元素将被初始化为零。

于 2012-08-16T20:14:50.053 回答
1

是的,你没记错。只是谷歌“C数组初始化”:

几点注意事项:

  • 在旧的 ANSI C 之前的编译器中,您不能总是为函数内部的“本地”数组提供初始化程序;您只能初始化“全局”数组,即任何函数之外的数组。这些编译器现在很少见,因此您不必再担心这种区别。

  • 当数组定义包含初始化器时,数组维度可以省略,编译器会根据初始化器的数量推断维度

  • 如果初始化器的数量少于数组中的元素,则剩余的元素会自动初始化为 0。

于 2012-08-16T20:15:03.407 回答