簡體   English   中英

通過設置為字符串文字初始化的C ++大小的char數組導致數組邊界溢出

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

我讀到,當初始化一個數組時,可以使用字符串文字。 但是如果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個元素的數組。 一切似乎還好。 為什么會出錯?

好吧,簡單的答案是這樣的:如果您要使用初始化程序,請為自己省些麻煩並省去大小。

更長的答案是字符串以空值結尾,這意味着在字符串的末尾還看不到其他字符。 因此,您將需要一個大小為n + 1的數組,其中n是您看到的字符數。

字符串文字"ABC"為您提供“ 4 const char數組”。 因為字符串以空字符結尾,所以有4個字符。 也就是說,您的初始化將等同於:

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

空字符會隱式地附加在字符串的末尾,以便遍歷數組內容的算法知道何時停止而無需明確給出字符串長度。

大小3不足以容納“ ABC”字符串:

 char cAr2[3] = "ABC"; 

您至少需要4個字符才能使用空終止符存儲此字符串

即使您的編譯器自動糾正了這一點(我不確定),減小數組的大小也不是一個好主意。

如果您想使用字符串文字進行初始化,我想您將需要執行以下操作:

char *cAr2 = "ABC";

但是,如果您想保持相同的類型,請執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM