C ++中的字符数组及其内存分配

时间:2016-03-05 04:15:41

标签: c++ arrays

看完课本后我有点困惑。考虑一下C ++中的字符数组ar[10]。在教科书中,它表示将为数组分配 10个字节

从下标ar[0]开始,我可以在给定数组中存储多少个元素?是10吗?如果是,我可以将数据存储在ar[10]吗?我想知道将为该数组分配多少字节,因为我知道每个字符串都以\0结尾。如果我尝试将字符存储到ar[10]

,是否会发生溢出

4 个答案:

答案 0 :(得分:4)

  

如果是,我可以将数据存储在ar [10]

没有

在您的示例中,ar是一个包含十个值的数组。第一个值是索引#0,因此包含ar[0]ar[9]。这是这个数组中的十个值。数数吧。我们大多数人都很方便地拥有十个手指。从ar[0]开始,用手指开始计时,当你用完所有十个手指时停止。你会停在ar[9]

尝试访问ar[10]是未定义的行为。

答案 1 :(得分:0)

它将共存储10个项目,包括' \ 0'。所以,9个字符,一个' \ 0' ar [9]中的null终止符。

答案 2 :(得分:0)

你可以存储十个值,从索引0到索引9.这一开始看起来真的很错误,但请记住,0在技术上是一个值,必须计为一个。它有点像unsigned int将如何保存2 ^ 32个值,但最高可用数字实际上是(2 ^ 32)-1。

请注意,如果您希望数组以空值终止,则只能存储9个字符,因为ar [9]将保留'\0'。你可以在那里存储另一个字符,但是必须围绕你的C字符串不是以空值终止的事实编写你的代码。

众所周知,在C ++中对字符串使用字符数组通常被认为是不好的做法。它比使用字符串标准库更容易出错。

更多信息:http://www.cplusplus.com/reference/string/string/

答案 3 :(得分:0)

因此,您已声明[10]因此它包含10个值。因为它是包含字符串和字符串的char数组由'\ 0'终止。 '\ 0'也是一个值。

因此,如果字符串长度为n,那么您的数组大小将为n + 1以保持n长度字符串。否则,将发生溢出。

请注意以下示例

int main(){

char a[1], r, t;

printf("Size %d Byte\n", sizeof(a));

a[0] ='a';
a[1] ='b';
a[2] ='c';

printf("%c\n",r); //c
printf("%c\n",t); //b

}

由于您的数组大小为1.虽然您没有指定r的值,但它分别由[2]和[1]自动分配。