MegaCraZy6
@MegaCraZy6
Юзерь

C++ при вводе в одно переменную меняеться вторая?

Дело было так писал я себя какую нить програмку от фонаря, чисто чтоб писать

Вот такой код:
#include <iostream>
using namespace std;

int main()
{
//  Simple coder, cimple decoder
int krypt,i;
char word[5];
char data[4096];
char krypted[5001];
///////////////////////////////
cout << "Crypt number : ";
cin >> krypt;
cout << "Uncrypt word : ";
cin >> word;
cout << "Crypt data : ";
cin >> data;

cout << endl << endl  << "Crypt number : " << krypt << endl << "Uncrypt word : " << word << endl << "Start crypting? Y/N" << endl;


Вроде бы ничего не обычного, но перменная krypt, меняеться непонятно почему, от разных вводов других данных а именно массивов.

cout << endl << endl  << "Crypt number : " << krypt << endl << "Uncrypt word : " << word << endl << "Start crypting? Y/N" << endl;


В этой строке я вижу что перменная krypt по какой-то причине сменила значение, не могу понять почему.

Вот кусок консоли.
Ситуация 1:
Crypt number : 54414
Uncrypt word : Hellow
Crypt data : 0989091


Crypt number : 119
Uncrypt word : Hellow
Start crypting? Y/N


Ситуация 2:
Crypt number : 54414
Uncrypt word : Hello
Crypt data : 0989091


Crypt number : 54272
Uncrypt word : Hello
Start crypting? Y/N
  • Вопрос задан
  • 193 просмотра
Решения вопроса 2
@res2001
Developer, ex-admin
Похоже, что на данной платформе стек растет вниз (в сторону уменьшения адресов), поэтому введя в word
6 символов (размер word - 5), произошел выход за пределы массива и последние 2 байта (не забываем, что строки в Си имеют еще дополнительный нулевой символ в конце) записались на соседние переменные, т.е. повредили содержащиеся в них значения.
При этом не произошло никакого сбоя, потому что все переменные в стеке (а все пространство в стеке изначально уже выделено и к нему можно свободно обращаться). Если бы word был динамическим массивом, то скорее всего произошел бы seg fault. В отладочной версии возможно и не произошел бы.
Си и С++ оставляет за программистом возможность управлять памятью, поэтому компилятор такие вещи не отслеживает.
Если хотите избавиться от ошибки, используйте класс string или перепишите код так что бы не было возможности выхода за границы массива.
Ответ написан
@Xilian
Программист 1С, сетевые технологии, SQL
>>Вроде бы ничего не обычного, но перменная krypt, меняеться непонятно почему, от разных вводов других данных а именно массивов.

Обнуляй переменные. При объявлении в С все переменные имеют случайные значения. А массив - это вообще указатель на случайный мусор в памяти.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы