Вот измененная версия кода со страницы 586 «Начиная с C ++ - от структур управления до объектов, 6e»:
#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», она должна перезаписывать соответствующее местоположение в «расширенной» userString.
Итак, память должна выглядеть так: [a] [a] [a] [a] [\ 0] [b] [a] [\ 0].
Затем, когда я запускаю функцию countChars, она, согласно книге, должна останавливаться на символе '\ 0', который находится сразу после первых четырех символов.
По этой логике должно быть выведено, что в строке 4 символа.
На самом деле, программа говорит, что есть 5 а.
Где ошибка в моих рассуждениях?
РЕДАКТИРОВАТЬ # 1: Это НЕ код из книги. Это модифицированный код.
РЕДАКТИРОВАТЬ # 2: Я изменил код специально, чтобы ввести переполнение строки. Я сделал это специально, потому что хочу посмотреть, действительно ли память работает так, как я думаю. Поэтому я хочу услышать убедительное объяснение того, почему ошибка не работает так, как я ожидаю.
РЕДАКТИРОВАТЬ # 3: Компилятор жалуется на поврежденный стек, но я нажимаю "продолжить", потому что я хочу видеть, что происходит.
Спасибо.