对C中的空零感到困惑

对C中的空零感到困惑,c,null,char,C,Null,Char,假设你有: 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]中包含什么?字符串文本(在本例中为March)具有隐式空终止符,因此char[]数组需要6个元素来存储它。引用C99标准第6.4.5节字符串文字的相关要点: 字符串文字

假设你有:

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]中包含什么?

字符串文本(在本例中为March)具有隐式空终止符,因此char[]数组需要6个元素来存储它。引用C99标准第6.4.5节字符串文字的相关要点:

字符串文字是包含在字符串中的零个或多个多字节字符的序列 双引号,如在xyz中

在翻译阶段7中,将值为零的字节或代码附加到每个多字节 由一个或多个字符串文本产生的字符序列

在这两种情况下,代码都超出了数组的末尾。代码当前具有未定义的行为

改为:

char a[6] = "March";
第二个代码段在索引从0到N-1(其中N是数组中的元素数)运行时访问数组末尾以外的位置。对于数组字符a[5];有效索引为0、1、2、3、4。

字符串文字(在本例中为March)具有隐式空终止符,因此char[]数组需要6个元素来存储它。引用C99标准第6.4.5节字符串文字的相关要点:

字符串文字是包含在字符串中的零个或多个多字节字符的序列 双引号,如在xyz中

在翻译阶段7中,将值为零的字节或代码附加到每个多字节 由一个或多个字符串文本产生的字符序列

在这两种情况下,代码都超出了数组的末尾。代码当前具有未定义的行为

改为:

char a[6] = "March";

第二个代码段在索引从0到N-1(其中N是数组中的元素数)运行时访问数组末尾以外的位置。对于数组字符a[5];有效索引为0、1、2、3、4。

空终止符\0位于最后一个插槽中。
之所以存在,是因为否则将无法检查字符串的长度。

空终止符\0位于最后一个插槽中。
它之所以存在是因为否则将无法检查字符串的长度。

如果从0到5计数,则包含6个元素


因此,必须声明一个字符[6],才能将str[0]包含到str[5]。

如果从0到5进行计数,则包含6个元素

因此,您必须声明一个字符[6]才能将str[0]转换为str[5]。

char[5]意味着您有5x大小的内存。0-5是大小的六倍:0第一、1秒、2第三、3第四、4第五、5第六。因此,您需要一个大小为6倍的片段:char[6]。第一个单元格零也会占用空间。

char[5]意味着您有5倍大小的内存。0-5是大小的六倍:0第一、1秒、2第三、3第四、4第五、5第六。因此,您需要一个大小为6倍的片段:char[6]。第一个单元格零也会占用空间。

首先,char在C中不是有效变量,它是一个关键字。你可能是说

char xyzzy[6];
或者类似的东西,创建一个名为xyzy的字符数组。但是,一旦这个问题解决了,就不会有任何东西进入xyyzy[6]。语句char xyzy[6];表示一个由六个字符组成的数组,其索引为0到5,包括:{0,1,2,3,4,5},这是六个元素

在任何情况下,除非您需要更大的数组,否则最好让编译器使用以下选项选择大小:

char xyzzy[] = "March";
首先,char在C中不是有效变量,它是一个关键字。你可能是说

char xyzzy[6];
或者类似的东西,创建一个名为xyzy的字符数组。但是,一旦这个问题解决了,就不会有任何东西进入xyyzy[6]。语句char xyzy[6];表示一个由六个字符组成的数组,其索引为0到5,包括:{0,1,2,3,4,5},这是六个元素

在任何情况下,除非您需要更大的数组,否则最好让编译器使用以下选项选择大小:

char xyzzy[] = "March";

char[6]中没有任何内容,但仍然需要大小为6的char[]来保存包括空终止符字节在内的6个字符。它们将进入char[0]到char[5]。char[6]仍然未定义。

char[6]中没有任何内容,但仍然需要大小为6的char[]来保存包括空终止符字节在内的6个字符。它们将进入char[0]到char[5]。char[6]仍然未定义

char array[n]
表示n个元素的长数组,而不是最后一个索引为n的数组。因为在C中,数组是基于零的,这意味着n元素数组的最后一个有效索引是n-1。因为一个字符串有一个零终止符,而March是5个字母,总共是6个字符,所以您必须编写char str[6]=March;。如果现在还不清楚,请不要包括数组的长度;对于初始化数组,编译器将自动填充它,因此您可以编写char str[]=March;相反

表示n个元素的长数组,而不是最后一个索引为n的数组。因为在C中,数组是基于零的,这意味着 n元素数组的有效索引为n-1。因为一个字符串有一个零终止符,而March是5个字母,总共是6个字符,所以您必须编写char str[6]=March;。如果现在还不清楚,请不要包括数组的长度;对于初始化数组,编译器将自动填充它,因此您可以编写char str[]=March;相反。

字符是关键字而不是变量名,所以不要将其用作关键字

数组索引:即计算从0开始的数组中的字符数,即[0]。

假设eg:tiger的数组中有5个字符,然后是[0]='t'和[4]='r'以及所有字符串文字。在本例中,字符数组以'\0'结尾,即EOF 性格因此,要存储一个由n个字符组成的数组,使用[n]编译器将在该数组的末尾添加“\0”。

Char是一个关键字,而不是一个变量名,因此不要将其用作一个

数组索引:即计算从0开始的数组中的字符数,即[0]。

假设eg:tiger的数组中有5个字符,然后是[0]='t'和[4]='r'以及所有字符串文字。在本例中,字符数组以'\0'结尾,即EOF
性格因此,要存储一个由n个字符组成的数组,使用[n]编译器将在该数组的末尾添加“\0”。

char[5]是一个包含5个元素的数组,而不是一个其中5是最大有效索引的数组。char[5]是一个包含5个元素的数组,而不是一个其中5是最大有效索引的数组。我知道,问题是为什么。因为您可能在runtimechar*上分配了字符串,因此您不能总是仅使用sizeof推断这些字符串的长度。要管理字符串,您必须:将长度保持在某个位置或使用终止符字符。C标准使用终止符字符。假设字符m[5]=March。看起来我把[5]搞糊涂了,这是元素的数量和最大有效索引的比较。m[5]是否表示元素数为5或最大有效索引数为5,因此最大字符数为6,即0、1、2、3、4、5,或者字符a[n]表示n个插槽的数组。所以最大索引是n-1。@daremarkovic,我在回答中提到了数组索引。我知道,问题是为什么。因为您可能在runtimechar*上分配了字符串,因此您不能总是仅使用sizeof推断这些字符串的长度。要管理字符串,您必须:将长度保持在某个位置或使用终止符字符。C标准使用终止符字符。假设字符m[5]=March。看起来我把[5]搞糊涂了,这是元素的数量和最大有效索引的比较。m[5]是否表示元素数为5或最大有效索引数为5,因此最大字符数为6,即0、1、2、3、4、5,或者字符a[n]表示n个插槽的数组。所以最大索引是n-1。@daremarkovic,我在回答中提到了数组索引。问题是,我似乎混淆了最大有效索引和元素数。char m[5]>>>这是否意味着它有5个元素,索引为0、1、2、3、4,或者最大有效索引为5,在这种情况下,它将有6个元素,0、1、2、3、4、5?@daremarkovic,前者。五个元素,索引0到4(含)。[]中的数字是元素数。i、 在你的例子中,问题是,我似乎混淆了最大有效索引和元素数。char m[5]>>>这是否意味着它有5个元素,索引为0、1、2、3、4,或者最大有效索引为5,在这种情况下,它将有6个元素,0、1、2、3、4、5?@daremarkovic,前者。五个元素,索引0到4(含)。[]中的数字是元素数。i、 你的情况是e.5。