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

C++ sized char array initialized by setting to string literal causes array bounds overflow

本文关键字:数组 char 溢出 边界 c++ 设置 字符串 字面值 初始化      更新时间:2023-10-16

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

#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个元素。一切似乎都很好。为什么错误?

字符串字面值"ABC"给出了一个"包含4个const char的数组"。有4个字符,因为字符串以空字符结束。也就是说,您的初始化将等同于:

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

null字符隐式地附加到字符串的末尾,以便在数组内容上循环的算法知道何时停止,而无需显式给定字符串长度。

好吧,简单的答案是这样的:如果你要使用初始化器,省去一些麻烦,省略大小。

较长的答案是字符串以空结束,这意味着在字符串的末尾有一个您看不到的额外字符。所以你需要一个大小为n+1的数组,其中n是你看到的字符数

对于"ABC"字符串,尺寸3不够大:

 char cAr2[3] = "ABC"; 

您需要至少4个字符来存储该字符串,并使用空终止符

即使你的编译器自动纠正(我不确定),它不是一个好主意,小于数组..

如果你想用字符串字面值初始化我想你会想这样做:

char *cAr2 = "ABC";

但是,如果您想保持相同的类型,请这样做:

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