0

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

什么默认没有初始化?

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

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

4

1 回答 1

2
  1. 在静态数组(或任何数组)中,当它被显式初始化时,所有未初始化的变量值都将为 0。
  2. calloc将它指向的内存归零。
  3. 全局变量值默认为 0。
  4. 占位符(这只是意味着所有其他选项都已初始化)。
  5. 如果未在append模式 ( ain fopen) 中打开,则光标位置将为 0。在append模式下,它将是文件的长度。
  6. 静态变量值默认为 0。
  7. 静态字符集(如果我理解正确的话)是一个char数组,与任何其他数组一样,初始化时 last 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
     */
}
于 2020-08-02T08:28:04.953 回答