【问题标题】:C programming: Initializing character arrays two different waysC 编程:以两种不同的方式初始化字符数组
【发布时间】:2020-08-20 03:23:48
【问题描述】:

我正在学习C中的数组。使用字符数组时,这两个语句有什么区别?

char my_char_array[] = {'M','y',' ','S','t','r','i','n','g'};

char my_char_array[] = "My String";

另外,如果我尝试将 my_char_array 的值打印到屏幕上,为什么会得到一些无法打印的字符(这发生在 my_char_array 被双向初始化的情况下)?

printf("Value of my_char_array[]:%s\n", my_char_array);

my_char_array[]的值:我的字符串╠╠╠╠╠╠╠╠╠╠╠

【问题讨论】:

  • 第二个有一个额外的字节用于空终止符。 第一个是未终止的,当您尝试使用需要空终止字符串的函数打印它时,您会得到未定义的行为。

标签: arrays c char


【解决方案1】:

这两个数组的主要区别是字符串终止字符\0。 数组,

char my_char_array[] = {'M','y',' ','S','t','r','i','n','g'};

末尾没有字符串终止字符。因此,printf 将继续打印,直到达到\0。但是,C 编译器会自动为以下数组插入一个字符串终止字符:

char my_char_array[] = "My String";

总之;

char my_char_array1[] = {'M','y',' ','S','t','r','i','n','g'};
char my_char_array2[] = "My String";
// are not equivalent

但是,

char my_char_array1[] = {'M','y',' ','S','t','r','i','n','g', '\0'};
char my_char_array2[] = "My String";
// are equivalent

【讨论】:

    【解决方案2】:
    char v1[] = {'M','y',' ','S','t','r','i','n','g'};
    char v2[] = "My String";
    

    v2 比 v1 长一个字节,最后一个字节包含许多 api(包括 printf 的 %s)用来确定 c 字符串结尾的空字符。

    【讨论】:

      【解决方案3】:

      与提到的其他答案一样,\0 是主要区别

      char my_char_array[] = {'M','y',' ','S','t','r','i','n','g'};

      该语句定义了一个char 数组。鉴于此声明

      char my_char_array[] = "My String";

      定义了一个string,在C语言中,它也是一个char数组,但末尾有一个额外的\0字符。

      char my_char_array[] = {'M', 'y', ' ', 'S', 't', 'r', 'i', 'n', 'g', '\0'};
      char my_char_array[] = "My String";
      

      是等价的,但是

      char my_char_array[] = {'M', 'y', ' ', 'S', 't', 'r', 'i', 'n', 'g'};
      char my_char_array[] = "My String";
      

      不是。至于您的输出,您不能使用 %s 格式说明符打印字符数组。您需要按元素访问它。

      【讨论】:

        【解决方案4】:

        您可能需要先检查这些链接

        我搜索了 C11 文档(您可以获取上面的文档链接),它说

        6.7.9 Initialization
        
        ... skipped
        14
        An array of character type may be initialized by a character string
        literal or UTF −8 string literal, optionally enclosed in braces.
        Successive bytes of the string literal (including the terminating null
        character if there is room or if the array is of unknown size) initialize
        the elements of the array.
        
        22
        If an array of unknown size is initialized, its size is determined by
        the largest indexed element with an explicit initializer. The array type
        is completed at the end of its initializer list.
        
        char my_char_array1[] = {'M','y',' ','S','t','r','i','n','g'};
        char my_char_array2[] = "My String";
        

        my_char_array1 变量大小未知。所以,总大小是最后一个'g'初始化程序。没有明确的空终止。

        my_char_array2 变量的大小也是未知的,但是,连续字节包括数组末尾的空字节。

        printf 该函数处理以空字符结尾的字符数组。它可能会打印字符,直到遇到 NULL 字节。这就是为什么你有奇怪的字符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-23
          • 2020-02-26
          • 1970-01-01
          • 1970-01-01
          • 2022-08-04
          • 1970-01-01
          • 2022-07-23
          • 2021-11-23
          相关资源
          最近更新 更多