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

  • Автор темы Guest
  • Дата начала
G

Guest

#1
Код:
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()) ???
 

grigsoft

Well-known member
15.11.2005
735
0
#2
Ты возвращаешь указатель на память, выделенную на стеке. После возврата из фукнции она уже не валидна. Стоит почитать про управление памятью в С\С++.
 
G

Guest

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

destr

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

grigsoft

Well-known member
15.11.2005
735
0
#5
При чем здесь случайность? когда вызывается ShowMessage, строка еще валидная, после выхода из F1 - уже нет.