Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   C++. Не пойму, почему такой код РАБОТАЕТ (https://forum.antichat.xyz/showthread.php?t=163678)

ZagZag 15.12.2009 11:41

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++. Мне ведь самому интересно как он работает на самом деле.
А еще лучше ответьте как сделать ввод из консоли правильнее.

Ra$cal 15.12.2009 11:45

так как переменная локальная, лишние символы хранятся на стеке. т.е. ты получаешь переполнение буфера, и при умелом использовании можешь засплоитить свою программу, заставив ее показать месаджбокс например. Суть C++ что контроль длины буфера в чистых массивах лежит на тебе. Поэтому и используют функции вида strncpy вместо strcpy.

ps: для лучшего понимания запусти свою программу под отладкой в ollydbg и посмотри, что произойдет со стеком.


Время: 06:47