【问题标题】:Char Array in Pointer larger than initialized? [duplicate]指针中的字符数组大于初始化? [复制]
【发布时间】:2014-06-05 06:02:08
【问题描述】:

我创建了一个缓冲区系统,但是与 C# 相比,确定从缓冲区读取的字符串相当困难。让我们考虑以下将 char* 创建到数组的代码:

int Size = 6;
char* String = new char[ Size ]();

这将创建一个指向指定大小的全新数组的指针。但是,如果我尝试访问超出该大小的索引,则不会显示越界错误:

String[ Size + 1 ];

相反,例如,我可以将数组“打印”为字符串:

String[ 0 ] = 'S';
String[ 1 ] = 'T';
String[ 2 ] = 'R';
String[ 3 ] = 'I';
String[ 4 ] = 'N';
String[ 5 ] = 'G';
cout << String << endl;

但是,这不仅会打印原始数组中的字符,还会打印原始数组之外的随机字符,例如超出数组范围的索引中的字符:(示例)

STRING&^%(^$$#%$*

代替:

STRING

为什么会发生这种行为,我该如何避免?

【问题讨论】:

    标签: c++ arrays bytearray


    【解决方案1】:

    原因是你的字符串不是NUL 终止的。将Size初始化为7String[ 6 ] = '\0';

    【讨论】:

    • 啊!我不认为字符串必须在我的缓冲区之外以空值结尾,所以这就是我搞砸的地方。我想知道为什么我的帖子投了反对票?这是一个非常有效的问题。
    • 确实如此。出于某种原因,当我第一次看到帖子时,SO 说我必须等待 2 分钟才能接受它作为答案。
    • 投反对票要么是因为问题有几十个重复项,要么是因为问题太基本(或两者兼而有之)。这可能是您在 C 书籍的第 1 章中学到的东西(尽管不鼓励使用 C 样式数组的现代 C++ 书籍可能不会在早期提及它)。
    猜你喜欢
    • 2016-06-27
    • 2014-09-26
    • 2010-12-12
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多