【问题标题】:String initialization with and without explicit trailing terminator带和不带显式尾随终止符的字符串初始化
【发布时间】:2010-09-08 03:42:27
【问题描述】:

有什么区别

char str1[32] = "\0";

char str2[32] = "";

【问题讨论】:

    标签: c


    【解决方案1】:

    好吧,假设两种情况如下(避免编译器错误):

    char str1[32] = "\0";
    char str2[32] = "";
    

    正如人们所说,str1 用两个空字符初始化:

    char str1[32] = {'\0','\0'};
    char str2[32] = {'\0'};
    

    但是,根据 C 和 C++ 标准,如果数组的一部分已初始化,则数组的其余元素将默认初始化。对于字符数组,其余字符全部初始化为零(即空字符),因此数组真正初始化为:

    char str1[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
                     '\0','\0','\0','\0','\0','\0','\0','\0',
                     '\0','\0','\0','\0','\0','\0','\0','\0',
                     '\0','\0','\0','\0','\0','\0','\0','\0'};
    char str2[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
                     '\0','\0','\0','\0','\0','\0','\0','\0',
                     '\0','\0','\0','\0','\0','\0','\0','\0',
                     '\0','\0','\0','\0','\0','\0','\0','\0'};
    

    所以说到底,两者真的没有区别。

    【讨论】:

    • 这是一个很好的答案。这让我也明白了为什么char a[2]="be" 不明智。
    • 通过malloc给字符串分配内存时,元素是否也初始化为'\0'?
    • @Lokesh:否——malloc() 分配的内存未初始化为任何确定的值。第一次分配内存时它可能是零,但如果它被修改、释放然后第二次分配,新分配的空间(通常)将(通常)具有释放时发生的任何值,除非malloc()使用其内部簿记等的一些空间。
    【解决方案2】:

    正如其他人所指出的,"" 意味着一个终止 '\0' 字符,因此 "\0" 实际上用两个空字符初始化数组。

    其他一些回答者暗示这是“相同的”,但这并不完全正确。可能没有实际区别——只要使用数组的唯一方法是将其作为从第一个字符开始的 C 字符串引用。但请注意,它们确实会导致两种不同的内存初始化,特别是它们在 Str[1] 是否绝对为零或未初始化(可能是任何东西,取决于编译器、操作系统和其他随机因素)方面有所不同。数组有一些用途(可能没用,但仍然有用)会有不同的行为。

    【讨论】:

    • 在指定数组大小的问题上下文中,结果是相同的 — 字母 'a' 后跟 31 个空字节 '\0'。只有在未调整大小的数组的上下文中才有区别。
    【解决方案3】:

    除非我弄错了,否则第一个会将 2 个字符初始化为 0('\0' 和始终存在的终止符,其余部分保持不变,最后一个将仅初始化 1 个字符(终止符)。

    【讨论】:

    • 数组的尾随字节也将是零字节。
    【解决方案4】:

    由于您已经声明了大小,因此两个声明完全相等。但是,如果您不指定大小,您可以看到第一个声明产生了一个更大的字符串:

    char a[] = "a\0";
    char b[] = "a";
    
    printf("%i %i\n", sizeof(a), sizeof(b));
    

    打印

    3 2
    

    这是因为 a 以两个空值结尾(显式空值和隐式空值),而 b 仅以隐式空值结尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2022-01-05
      相关资源
      最近更新 更多