Strcpy() - может искажать значение ?

Тема в разделе "Общие вопросы по С и С++", создана пользователем -, 25 сен 2008.

  1. Гость

    Код (Text):
    char sss[2]="01";
    //--------------------
    char* F1()
    {
    char s[3];
    switch(sss[0])
    {
    case '0': s[0]='Z'; break;
    case '1': s[0]='W';
    }
    switch(sss[1])
    {
    case '0': s[1]='X'; break;
    case '1': s[1]='Y';
    }
    s[2]='\0';
    //ShowMessage(s);
    return s;
    }
    //--------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    char s[5]={0};
    strcpy(s,F1());
    ShowMessage(AnsiString(s));
    }
    При запуске данного кода выдаёт .@ а должен выдавать ZY
    Но если в F1() раскомментировать ShowMessage(s), то будет выдавать правильный результат
    Где происходит искажение результата? В функции strcpy(s,F1()) ???
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ты возвращаешь указатель на память, выделенную на стеке. После возврата из фукнции она уже не валидна. Стоит почитать про управление памятью в С\С++.
     
  3. Гость

    Но при чём здесь ShowMessage()?
    Или её действия чисто случайны?
     
  4. destr

    destr Гость

    Конечно, случайны. Видимо где-то что-то не подчистилось ещё, поэтому вы и успеваете скопировать.
     
  5. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    При чем здесь случайность? когда вызывается ShowMessage, строка еще валидная, после выхода из F1 - уже нет.
     
Загрузка...

Поделиться этой страницей