Задумывались ли вы об использовании std :: string из STL?
Хотя первая проблема, которую я вижу, это.
человек :: человек ()
{
имя = новый символ [3];
зЬгср (имя, "NILL");
Имя [3] = '\ 0';
}
Вы выделяете массив символов, размер массива составляет 3 символа, затем копируете в него «NILL» с помощью strcpy, так что вы заполняете массив всеми символами, но без нулевого терминатора \ 0. «NILL» - это константная строка, которая имеет нулевой терминатор, который неявный, но не показан, например, «NILL \ 0». \ 0 является управляющим символом , который используется для обозначения конца строки. Тогда у вас будет индекс за пределами границ при доступе к 3-му элементу массива имен, когда ваш размер массива равен 3.
Чтобы помочь вам найти другие части, которые могут работать неправильно, вот несколько ссылок на функцию, которую вы используете.
зЬгср
StrLen
strcpy скопирует всю строку из одного буфера в следующий, включая управляющий символ нулевого терминатора.
Strlen возвратит количество символов между началом строки и завершающим нулевым символом . Хотя это не будет считать нулевой символ как символ. Вот почему вы увидите предложения с strlen (строка) +1 для включения нулевого терминатора.
Несмотря на то, что вы хорошо справляетесь с работой, вы поймете эти мелочи, когда будете использовать стандартные библиотечные функции.