代码之家  ›  专栏  ›  技术社区  ›  LeopardSkinPillBoxHat

为什么编译器不能为字符串数组派生字符串长度?

  •  4
  • LeopardSkinPillBoxHat  · 技术社区  · 15 年前

    注: this answer .

    char myString[] = "This is my string";
    

    这将分配长度为18的字符串(包括 \0 字符),并为其指定指定值。

    但是,以下方面:

    char myStrings[][] = {"My 1st string", "My 2nd string", "My 3rd string"};
    

    无效,给出错误“数组类型的元素类型不完整”。

    所以我必须像这样指定数组:

    char myStrings[][20] = {"My 1st string", "My 2nd string", "My 3rd string"};
    

    这将按照预期进行编译和工作。

    编辑:

    我只是想澄清一下,这不是我正在经历的现实生活中的编程问题——这只是病态的好奇心。

    4 回复  |  直到 7 年前
        1
  •  5
  •   AnT stands with Russia    15 年前

    一件事是“感知”一根字符串的长度。另一件事是计算许多字符串的最大长度。两者之间有某种直观的定性差异。因此,语言作者可能认为前者简单且有用,但后者过于可编译且不太有用。

        2
  •  4
  •   i_am_jorf    15 年前

    为什么不:

    const char* myStrings[] = {"My 1st string", "My 2nd string", "My 3rd string"};
    
        3
  •  3
  •   pmg    15 年前

    char myStrings[][20] = {"My 1st string", "My 2nd string", "My 3rd string"};
    

    作为

    char myStrings[][20] = {(char*), (char*), (char*)};
    

    然后,呃。。。嗯,有了“编译器魔法”,它可以复制这些文件中的字符 (char*)


    编辑

    在C语言中不能有“锯齿数组”

    char my_strings[][] = {"a", "ab", "abc", "foo foo fo foo foo", "abc", "ab", "a"};
    

    my_strings[0] 需要与相同的空间 my_strings[3]

    my_strings in memory
        'a' '\0' '\0' ...  '\0' but must be a definite size
        'a' 'b'  '\0' ...  '\0' definite size
        ...
        'f' 'o'  'o'  ...  '\0'
        ...
    

    要找到最大大小并初始化数组,编译器需要对字符串文本进行两次传递。

        4
  •  2
  •   Alphaneo    15 年前

    char myString[]=“…”是一个一维数组,它可以工作。 char myStrings[][]={“…”,“…”}是一个具有(可能)不同行长度的二维数组,这将不起作用。

    根据C标准,编译器无法检测2D数组中字符串的长度。