【问题标题】:question about default initialization in c关于c中默认初始化的问题
【发布时间】:2020-08-02 07:24:13
【问题描述】:

我正在准备面试,发现这个问题有点令人困惑。非常感谢您的建议。

什么是默认不初始化的?

  1. 静态数组的最后一个变量,其中第一个变量在语句中显式初始化。
  2. 使用calloc 函数分配的动态数组成员。
  3. 全局变量。
  4. 这里提供的所有数据都是默认初始化的。
  5. 文件打开时的当前光标位置。
  6. 一个静态变量。
  7. 静态字符集中的最后一个字符。

认为答案是#1,但不确定解释。

【问题讨论】:

  • 静态变量在 main 启动之前被初始化。我认为答案是 4。
  • "文件打开时的当前光标位置"是什么意思?此外,这似乎与其他人完全脱节。 “默认初始化”。材料/问题可能具有可疑性质 - 请提供您在何处(书籍/链接等)找到此内容的信息。
  • 我猜这句话是指 fseek 但好点,我们不应该猜测。
  • @AleksanderBobiński 是的,但是与“默认初始化”有什么关系? OP 需要澄清他们的来源。
  • 我怀疑“open”应该是“opened”(如fopen)——在这种情况下,初始文件偏移量将被初始化。

标签: c default-initialization


【解决方案1】:
  1. 在静态数组(或任何数组)中,当显式初始化时,所有未初始化的变量值都将为 0。
  2. calloc 将其指向的内存归零。
  3. 默认全局变量值为 0。
  4. 占位符(这意味着所有其他选项都已初始化)。
  5. 如果没有在append 模式下打开(afopen),光标位置将为 0。在append 模式下,它将是文件的长度。
  6. 静态变量值默认为 0。
  7. 静态字符集(如果我理解正确的话)是一个char 数组,并且与任何其他数组一样,在初始化最后一个char 时,如果未初始化,将为0。 对于 char 数组,最后一个 char 将是 NULL 字节,其目的是为 0 以标记字符串的结尾。

如您所见,默认情况下所有选项均已初始化,因此答案为 4。

如果您不确定,请始终使用简单的代码检查您的问题:

#include <stdio.h>
#include <stdlib.h>

void test1()
{
    static int arr[5] = { 1,2,3,4 };
    printf("Last variable is %d\n", arr[4]);
}

void test2()
{
    int* arr = (int*)calloc(5, sizeof(int));
    int b = 1;
    for (int i = 0; b && i < 5; i++)
        if (arr[i])
            b = 0;
    if (b) puts("Calloc zero all elements");
    else puts("Calloc doesn't zero all elements");
}

int test3_arg;

void test3()
{
    printf("Global variable default value is %d\n", test3_arg);
}

void test5()
{
    FILE* file = fopen(__FILE__, "r");
    printf("The current cursor location is %ld\n", ftell(file));
    fclose(file);
}

void test6()
{
    static int arg;
    printf("Static variable default value is %d\n", arg);
}

void test7()
{
    static char arg[] = "hello";
    printf("The last character is %d\n", arg[5]); //last one will be the NULL byte (0)
}

int main()
{
    test1();
    test2();
    test3();
    test5();
    test6();
    test7();

    return 0;

    /*
     * Output:
    Last variable is 0
    Calloc zero all elements
    Global variable default value is 0
    The current cursor location is 0
    Static variable default value is 0
    The last character is 0
     */
}

【讨论】:

  • 除非您非常 100%(或更多)确定您的编译器配置为非常 100% 符合标准,否则使用代码进行测试并不是一个好主意。
  • 0 是一个完全有效的 garbage 值,即 0 并不意味着它是默认初始化的。
  • 我知道0 可能是垃圾,但我知道没有代码的答案要么知道它们是0,而且通常0 不是垃圾值。另外,我没有初始化 0 值,所以我无法决定它们。
  • @רועיאבידן :当您在行中使用1.2. 等时,数字是什么并不重要(我实际上对它们都使用1),因为 SO 分配连续数字。所以,即使你有1,2,3,5,6,7,它们也会显示为1-6。添加了一个占位符来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多