gpt4 book ai didi

C++ 字符串溢出

转载 作者:太空宇宙 更新时间:2023-11-04 16:30:07 25 4
gpt4 key购买 nike

这是“开始使用 C++ - 从控制结构到对象,6e”的第 586 页代码的修改版本:

#include <iostream>
using namespace std;

int countChars(char *, char);

int main()
{
const int SIZE = 5;
char userString[SIZE];
char letter;

cout << "Enter a string: ";
cin.getline(userString, 10);

letter = '\0';
cout << "a appears ";
cout << countChars(userString, 'a') << " times.\n";

cin >> letter;
return 0;
}

int countChars(char *strPtr, char ch)
{
int times = 0;
while (*strPtr != '\0')
{
if (*strPtr == ch)
times++;
strPtr++;
}
return times;
}

现在运行程序并输入“aaaabba”。

现在,我在这里专门尝试介绍了错误的内存写入。例如。我声明char数组大小为5,但在提示时输入超过4个(5减去\0的长度)个字符。

假设系统在“userString”之后为“letter”分配内存,那么当我向“letter”写入内容时,它应该覆盖“扩展”userString 中的相应位置。

所以内存应该是这样的:[a][a][a][a][\0][b][a][\0].

然后,当我运行 countChars 函数时,根据书本,它应该在“\0”字符处停止,该字符紧跟在前四个 a 之后。

按照这个逻辑,应该输出字符串中有4个a。

实际上,程序说有 5 个 a。

我的推理哪里出错了?

编辑#1:这不是书中的代码。这是修改后的代码。

编辑 #2: 我专门更改了代码以引入字符串溢出。我是故意这样做的,因为我想看看内存是否真的按照我认为的方式工作。所以我想听到的是关于为什么这个错误没有像我预期的那样工作的可靠解释。

编辑#3:编译器确实提示堆栈损坏,但我按下“继续”因为我想看看会发生什么。

谢谢。

最佳答案

即使您只为 5 个字符分配了空间,也没有检查,结果您的程序厚颜无耻地覆盖了数组后面地址处的任何内容。在您的特定情况下,您很(不)幸运并且没有看到崩溃 - 但实际上这是未定义的行为。唯一的 NUL 终止符位于您读入的字符串的末尾,而不是第五个位置,因此您会看到所有的 a。这不是正确的做事方式...

关于C++ 字符串溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8024723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com