通过设置为字符串文字初始化的C ++大小的char数组导致数组边界溢出

时间:2013-01-15 16:46:59

标签: c++

我读到当一个人使用数组时,可能会使用字符串文字。 但是如果列表中的inicializers大于数组的大小,则会捕获错误。

#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 个答案:

答案 0 :(得分:3)

嗯,简单的答案就是这样:如果你打算使用初始化程序,可以省去一些悲伤并省去大小。

更长的答案是字符串以空值终止,这意味着在字符串末尾没有看到另外一个字符。所以你需要一个大小为n + 1的数组,其中n是你看到的字符数。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

 char cAr2[3] = "ABC"; 

您需要至少4个字符才能使用null终结符存储此字符串

即使您的编译器自动更正(我不确定),也不应该小一点数组。

答案 3 :(得分:-2)

如果你想使用字符串文字进行初始化,我想你会想做这样的事情:

char *cAr2 = "ABC";

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

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