C++. Не пойму, почему такой код РАБОТАЕТ

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ZagZag, 15 Dec 2009.

  1. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Code:
    #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++. Мне ведь самому интересно как он работает на самом деле.
    А еще лучше ответьте как сделать ввод из консоли правильнее.
     
  2. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    так как переменная локальная, лишние символы хранятся на стеке. т.е. ты получаешь переполнение буфера, и при умелом использовании можешь засплоитить свою программу, заставив ее показать месаджбокс например. Суть C++ что контроль длины буфера в чистых массивах лежит на тебе. Поэтому и используют функции вида strncpy вместо strcpy.

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