这是“从 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”写入内容时,它应该覆盖“扩展”用户字符串中的相应位置。
所以内存应该是这样的:[a][a][a][a][\0][b][a][\0]。
然后,当我运行 countChars 函数时,根据本书,它应该停在 '\0' 字符处,即前四个 a 之后。
按照这个逻辑,它应该输出字符串中有 4 个 a。
实际上,程序说有 5 个 a。
我的推理错误在哪里?
编辑#1:这不是书中的代码。这是修改后的代码。
编辑#2:我专门更改了代码以引入字符串溢出。我是故意这样做的,因为我想看看记忆是否真的像我想的那样工作。所以我想听到的是关于为什么这个错误不能像我期望的那样工作的可靠解释。
编辑#3:编译器确实抱怨堆栈损坏,但我按“继续”,因为我想看看会发生什么。
谢谢你。