【问题标题】:What is the default value of members of a char array in C?C中char数组成员的默认值是多少?
【发布时间】:2012-09-26 20:19:19
【问题描述】:

假设我创建了一个char 数组,并且假设 char 数组为空。如果我检查数组中第一个元素的值 (arr[0]),这个表达式的结果是什么?

【问题讨论】:

  • 你尝试的时候发生了什么?
  • '我假设 char 数组是空的' -- 这是什么意思?
  • 投反对票,因为@user1723575 自己可以通过尝试或快速谷歌搜索(或堆栈溢出搜索)轻松回答这个问题。我不明白为什么这个微不足道的问题有 5 个答案。
  • 我今天(2014 年)用谷歌搜索了“char 数组初始值”。这个堆栈溢出问题是第一个命中。我几乎认为我来这里是在浪费我的时间,因为这个问题被否决了并且“被关闭为不是一个真正的问题”。幸运的是,John Bode 的回答给了我想要的答案。
  • 我同意@TimGradwell,下面的答案很有帮助,我理解用户的要求。提问者本可以利用社区的一些帮助来使问题更清楚。当您不熟悉编程时,您可能没有足够的词汇来表达您的需求(因此社区的问题编辑能力)。

标签: c arrays char default


【解决方案1】:

这取决于数组的声明位置和方式。

如果数组是在文件范围内声明的(在任何函数之外),或者声明为static,并且没有显式的初始化器,那么数组的内容将被初始化为0。

如果数组是在块范围内声明的(在函数或块内)并且没有声明为static,并且没有显式初始化器,那么数组的内容是不确定的 (本质上是垃圾值,其中一些可能是陷阱表示)。

如果数组已被显式初始化,则它包含初始化程序中的任何内容。

编辑

针对下面的 cmets,请注意您不应该依赖隐式初始化块范围变量。如果您需要在创建时将块范围数组清零,请使用初始化程序:

char foo[N] = {0};

当初始化器中的元素少于数组中的元素时,数组中与初始化器中的元素对应的元素将被设置为指定的值;所有剩余的条目将被隐式初始化,就好像它们被声明为static

在上面的示例中,这意味着foo 的第一个元素显式设置为0,而所有其余元素都隐式设置为0

【讨论】:

  • 无论如何,依赖它是不好的形式。必须为零的变量应显式初始化为零。
  • @John Bode:你所说的都是事实——我只是担心 OP 的外卖可能是“哦——我应该让我的所有变量都是静态的,所以我不必初始化他们。”一个更好的答案可能已经触及(但很简短)“定义”与“声明”的问题,或者为什么变量应该是自动的、静态的还是从堆中分配的。我同意 jforberg 的观点。恕我直言...
  • 我想你可以直接说char foo[N] = {};
  • 我想澄清一个不确定的值也可以是 0。这意味着如果 foo[0] 在没有显式初始化程序的情况下默认初始化为 0,则 foo 的长度确实为 0。
【解决方案2】:

如果是auto变量,除非你显式初始化它,否则它会被垃圾填充,所以没有默认值。 arr[0] 可能包含一个看似随机的值,直到明确更改为包含其他内容。

当然,如果您初始化了数组(这意味着您使用 memset()for 循环或函数调用或任何其他方式显式地用初始值填充数组),您将得到确切的结果你期望:你初始化它的值。

请注意声明和初始化之间的区别。

void f(void) {
    int x;  // (1)
    x = 10; // (2)
}

(1) 处,您声明了一个 auto 整数变量。它现在有一个未定义的值(垃圾)。在 (2) 处,您正在初始化变量。它现在的值为10

当然,声明和初始化可以同时完成:

void f(void) {
    int x = 10;
}

数组也是如此:

void f(void) {
    int x[2];  // x contains 2 junk values, so x[0] == junk
    x[0] = 1;  // x contains { 1, junk },   so x[0] == 1
    x[1] = 2;  // x contains { 1, 2 },      so x[0] == 1
}

或者,声明和初始化它:

void f(void) {
    int x[2] = { 1, 2 };
}

【讨论】:

    【解决方案3】:

    当你第一次初始化任何变量时,不要期望它有任何特定的值,除非你明确指定它。除非您自己设置,否则它将充满随机的东西。

    【讨论】:

    • 我将它的值与 '\0' ex: arr[0]=='\0' 进行了比较,结果是正确的,我认为这是因为内存中的空间确实是空的,但是如果它有其他东西我会错的,对吧?
    • 是的,你永远不知道什么可能已经存在或不存在。
    【解决方案4】:

    当初始化数组时。你正在分配一个静态内存。然后你会得到分配内存的值,所以它是随机值

    如果您想将整个数组设置为 0 则(根据 Hunter McMillen 备注)

    char arr[size] = { 0 }
    

    或使用memset()函数

    memset(arr,0,sizeof_your_arr);
    

    【讨论】:

    • 你也可以这样做:char arr[size] = { 0 }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2011-02-06
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多