我有一个定义为arr[5]
的数组。我可以填充和使用最后一个元素,例如arr[5]=1000
吗?如果是,'\0'
将存储在数组中的什么位置?此外,我不是在使用尚未声明的内存吗?
答案 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'
。完全可以在此处分配其他内容,但是在将其打印为以空字符结尾的字符串时会遇到问题。