假设您有:
char[5] = "March";
这在 C 中不起作用,虽然:
char[0]='M'
char[1]='a'
char[2]='r'
char[3]='c'
char[4]='h'
char[5]='\0'
出于某种原因,我不得不对 C 说,char[6]="March"
而不是char [5]
.
为什么是这样?进入char[6]
什么?
首先,char
不是 C 中的有效变量,它是关键字。你可能是说
char xyzzy[6];
或类似的东西,这将创建一个名为xyzzy
. 但是,一旦解决了,就什么都没有了xyyzy[6]
。该语句表示一个由六个字符char xyzzy[6];
组成的数组,其索引通过inclusive: ,即六个元素。0
5
{0,1,2,3,4,5}
无论如何,除非您需要更大的数组,否则您通常最好让编译器选择大小:
char xyzzy[] = "March";
在这种情况下,字符串文字"March"
具有隐式空终止符,因此char[]
数组需要6
元素来存储它。引用C99 标准的第6.4.5 节字符串文字的相关点:
字符串文字是用双引号括起来的零个或多个多字节字符序列,如“xyz”。
在翻译阶段 7 中,将一个字节或值为零的代码附加到由一个或多个字符串文字产生的每个多字节字符序列。
在这两种情况下,代码都超出了数组的末尾。该代码当前具有未定义的行为。
改成:
char a[6] = "March";
第二个代码片段访问数组末尾之外的索引,因为索引从0
到N - 1
,其中N
是数组中的元素数。对于数组char a[5];
,有效索引是0, 1, 2, 3, 4
。
如果从 0 到 5 包括在内,则有 6 个元素。
因此,您必须声明 achar[6]
才能str[0]
必须str[5]
。
char [5]
意味着,你有 5x sizeof(char) 的内存。0-5 是 sizeof(char) 的六倍:0 第一,1 第二,2 第三,3 第四,4 第五,5 第六。所以你需要一个 6 倍 sizeof(char): 的段char [6]
。第一个单元格为零,也占用空间。
char[6] 中没有任何内容,但您仍然需要一个大小为 6 的 char[] 来保存包括空终止符字节在内的 6 个字符。它们将通过 char[5] 进入 char[0]。char[6] 仍未定义。
Char
是关键字而不是变量名,所以不要把它当做一个。
数组索引:即从0开始计算数组中字符的个数,即a[0]。
假设数组中有 5 个字符(例如:tiger),那么 a[0] = 't' 和 a[4] = 'r' 以及在这种情况下的所有字符串文字,字符数组以 '\0 结尾' 即 EOF
字符。因此,要存储一个包含 n 个字符的数组,使用 [n] 编译器将在该数组的末尾添加 '\0'。
空终止符 \0 进入最后一个插槽。它在那里是因为否则将无法检查字符串的长度。
char array[n]
表示一个 n 元素长数组,而不是最后一个索引为 的数组n
。因为在 C 中,数组是从零开始的,这意味着 n 元素数组的最后一个有效索引是n - 1
. 由于字符串有一个零终止符,而“March”是 5 个字母,所以一共有 6 个字符,所以你必须写char str[6] = "March";
. 如果现在这令人困惑,请不要包括数组的长度;对于初始化的数组,编译器会自动填充它,所以你可以改写char str[] = "March";
。