0

我读到,当初始化一个数组时,可以使用字符串文字。但是如果初始化器的列表大于数组的大小,则会捕获错误。

#include "stdafx.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    char cAr2[3] = "ABC";
    for (int i = 0; i < 3; i++)
        cout<<cAr2[i]<<endl;
    system("pause");

    return 0;
}

好吧,这个例子在我的书中给出。它真的像这样结束:错误C2117:'cAr2':数组边界溢出。

你能告诉我这里是什么吗:我可以看到一个包含 3 个元素的数组和 3 个元素被放入其中。一切似乎都很好。为什么会出错?

4

4 回答 4

3

好吧,简单的答案是这样的:如果您要使用初始化程序,请省去一些麻烦并忽略大小。

更长的答案是字符串是以空值结尾的,这意味着在字符串的末尾有一个您看不到的附加字符。因此,您将需要一个大小为 n+1 的数组,其中 n 是您看到的字符数。

于 2013-01-15T16:50:00.753 回答
3

字符串文字"ABC"为您提供“4 的数组const char”。有 4 个字符,因为字符串以空字符结尾。也就是说,您的初始化将等同于:

char cAr2[] = {'A', 'B', 'C', '\0'};

空字符隐式附加到字符串的末尾,以便循环遍历数组内容的算法知道何时停止,而无需明确给出字符串长度。

于 2013-01-15T16:50:26.120 回答
1

对于“ABC”字符串,大小 3 不够大:

 char cAr2[3] = "ABC"; 

您需要至少 4 个字符来存储带有空终止符的字符串

即使您的编译器自动更正(我不确定),缩小数组大小也不是一个好主意。

于 2013-01-15T16:49:05.130 回答
-2

如果您想使用字符串文字进行初始化,我认为您需要执行以下操作:

char *cAr2 = "ABC";

但是,如果您想保持相同的类型,请执行以下操作:

char cAr2[3] = { 'A', 'B', 'C' };
于 2013-01-15T16:53:11.417 回答