为什么c++中长度为n的字符串在[n]索引上总是有一个空字符作为垃圾?

Why does a char string of n length in c++ always have a null char on [n] index as garbage?

本文关键字:有一个 字符 c++ 字符串 为什么 索引      更新时间:2023-10-16

声明长度为n的字符数组时,[n]处的值始终为0。它不应该是一个垃圾值吗?

#include <stdio.h>
int main() {
    char arr[3];
    arr[0] = 'a'; arr[1] = 'b'; arr[2] = 'c';
    // Here arr[3] can be any garbage value.
    // But it always appears to be 0. Why?
    // Also arr[4], arr[5], arr[6]... are not 0,
    // just some garbage as expected
    printf("itch  asciin");
    int i;
    for(i = 0; arr[i] != 0; i++) //Always breaks at i=3
        printf("%dt%ct%dn", i, arr[i], (int) arr[i]);
    int more = i + 5;
    for(; i<more; i++)
        // I am intentionally going outside the bound
        printf("%it%ct%dn", i, arr[i], (int) arr[i]);
    return 0;
}

预期输出

你认为输出会是什么?您可以假设:

i   ch  ascii
0   a   97
1   b   98
2   c   99
3   N   78  ----> (This may or may not be 0)
4   �   -103
5   N   78
6   �   -125
7   �   -100

实际输出
i   ch  ascii
0   a   97
1   b   98
2   c   99
3       0  ----> (Why is this always 0?)
4   �   -103
5   N   78
6   �   -125
7   �   -100

注意:int/double/float数组不会发生这种情况。

数组中没有空终止符。printf读过了末端。这是c++标准中未定义的行为。它以ara[4]结尾,因为你(不)幸运。它可以走得更远,甚至使你的程序崩溃,因为它应该做的是undefined

为了合理化在ara[4]处的停止:在缓冲区

之外的位置可能有一个字符。

您对i==''的期望如何只需迭代数组大小或将字符值与''进行比较。由于内存中的垃圾值而获得的随机索引

很可能您的实现将局部变量布置为

  • ara - 3 bytes
  • padding - 1字节
  • i(或其他局部变量)。

因此,当您到达ara的末尾并进入未定义行为时,结果仍然是相当确定的(但如果您使用不同的编译器,则可能会发生变化)。

相关文章: