我们可以使用数组的最后一个元素吗?

时间:2018-11-04 16:32:11

标签: c++ arrays

我有一个定义为arr[5]的数组。我可以填充和使用最后一个元素,例如arr[5]=1000吗?如果是,'\0'将存储在数组中的什么位置?此外,我不是在使用尚未声明的内存吗?

2 个答案:

答案 0 :(得分:5)

您不能使用arr[5],因为它不是数组的最后一个元素。就像您越界读取一样,这将调用undefined behavior。数组的最后一个元素是arr[4]

不是\0的空字符不会自动插入每个数组中。它总是插入string literal中,而不是用户定义的日常数组中。

例如,这将起作用:

char arr[] = "Hello"; // array of 6 elements initialized with a string literal
                      // 5 for the characters plus 1 for the invisible \0
std::cout << arr[5];  // OK

这不会:

int arr[5] = { 1, 2, 3, 4, 5 }; // user defined array of 5 elements
std::cout << arr[5];            // Not OK! Reading out of bounds == UB

因为没有arr[5]这样的东西,也没有空字符附加到5个整数的数组中。

答案 1 :(得分:3)

如果arr[5]定义为包含5个元素,则不能使用它,因为在这种情况下,arr[5]不是最后一个元素。
示例:

int arr[5] = {10, 11, 12, 13, 14}

在这里,最后一个元素为arr[4],其值为14,尝试arr[5]之类的元素为undefined它可能适用于您的编译器和计算机,但是依靠未定义的行为是一个非常糟糕的主意。有关更多说明,请参见this

'\0'作为最后一个元素是C样式的以空字符结尾的字符数组。在这种情况下,最后一个元素是'\0'(因此名称​​ null终止)。仍然没有超出范围,最后一个元素只是'\0'
示例:
    char arr[5] = "food";
这里arr[4]被隐式分配给'\0'。完全可以在此处分配其他内容,但是在将其打印为以空字符结尾的字符串时会遇到问题。