ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
C++. Не пойму, почему такой код РАБОТАЕТ |

15.12.2009, 11:41
|
|
Участник форума
Регистрация: 22.02.2007
Сообщений: 213
Провел на форуме: 388345
Репутация:
58
|
|
C++. Не пойму, почему такой код РАБОТАЕТ
Код:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char a[5];
ReadString("Input: ", a);
printf("Value: %s\n", a);
system("PAUSE");
return 0;
}
int ReadString(char *prompt, char *ret) {
printf(prompt);
scanf("%s", ret);
fflush(stdin);
return 0;
}
Всегда забываю, как грамотно делать хранение переменных в C++. Поэтому решил разобраться с этой темой подробно.
Пишу функцию для ввода строки из консоли (нужно для курсовика).
Алгоритм такой:
1. Объявить буфер для ввода, размером в максимально возможное значение.
2. Передать указатель на буфер в функцию.
3. В функции принять значение из консоли в буфер
4. Вывести значение из буфера в консоль.
Приведенный код работает, но даже тогда, когда вводится значение, длина которого превышает размер буфера.
Отсюда вопросы: я не понимаю как работает код? Или где тогда хранится оставшаяся часть введенной строки?
Объясните, просветите =)
Сильно не пинайте, ну не умею я еще в уме трассировать C++. Мне ведь самому интересно как он работает на самом деле.
А еще лучше ответьте как сделать ввод из консоли правильнее.
|
|
|

15.12.2009, 11:45
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
так как переменная локальная, лишние символы хранятся на стеке. т.е. ты получаешь переполнение буфера, и при умелом использовании можешь засплоитить свою программу, заставив ее показать месаджбокс например. Суть C++ что контроль длины буфера в чистых массивах лежит на тебе. Поэтому и используют функции вида strncpy вместо strcpy.
ps: для лучшего понимания запусти свою программу под отладкой в ollydbg и посмотри, что произойдет со стеком.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|