【问题标题】:C Char Array Creation DifferencesC 字符数组创建差异
【发布时间】:2014-12-13 22:29:38
【问题描述】:

在 C 语言中,我注意到有几种方法可以声明一个 char 数组。有什么区别:

  1.  

    char arr[10] = "abcdefghij";
    
  2.  

    char* arr2[10] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
    
    • gcc 说我需要 2 中的 char 之后的星号,而不是 1 中的星号。
    • 打印 1 时我可以使用printf("%s\n", arr); and it prints abcdefghij@
    • 打印 2 时,我必须使用 for 循环

它们为什么不同?

【问题讨论】:

  • 如果第二点 printf("%s\n", arr); 是未定义的行为,因为 arr 不会由空字符终止。你需要一个额外的元素来存储这个'\0' 字符。您可以简单地将您的字符数组声明为 char arr[] = "abcdefghij";,然后问题就消失了。
  • 为什么标记为 C++?这不是合法的 C++ 代码。您是在询问“太多初始化程序”错误吗?
  • 这不是作业,我只是想为面试做编程题。

标签: c++ c arrays printing printf


【解决方案1】:

因为 1 是一个 char 数组,而第二个是一个数组数组,因为“a”实际上是一个由 2 个字符 'a' 和 '\0' 组成的数组

【讨论】:

  • 嗯,第二个是指向数组的指针数组。它的类型不是char[10][2]
  • 这是一个例子。实际上,只有 10 个指向内部 char 数组的指针保留在堆栈中。
【解决方案2】:

arr是10个元素的char向量,arr2是10个元素的chars指针向量

char arr2[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};

等于arr

【讨论】:

    【解决方案3】:

    在第一个中,您只是声明了一个字符串,但在第二个中,您创建了 10 个指向 10 个字符串的指针。举个例子

    char* arr2_0 = "a" ;
    char* arr2_1 = "b" ;
    char* arr2_2 = "c" ;
    char* arr2_3 = "d" ;
    char* arr2_4 = "e" ;
    char* arr2_5 = "f" ;
    char* arr2_6 = "g" ;
    char* arr2_7 = "h" ;
    char* arr2_8 = "i" ;
    char* arr2_9 = "j" ;
    

    【讨论】:

      【解决方案4】:

      要了解这种行为,您必须了解字符串和字符之间的区别。前者是用" 创建的,可以包含多个字符,而后者是用' 创建的,只代表一个字符。由于您在数组初始化中使用了",因此您创建了一个字符串数组,而不是字符数组。现在字符串通过指向字符的指针来表示。因此编译器希望你创建一个指向字符的指针数组,而不是一个字符数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 2018-06-03
        • 1970-01-01
        相关资源
        最近更新 更多