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

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

Guest

Код:
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()) ???
 
Ты возвращаешь указатель на память, выделенную на стеке. После возврата из фукнции она уже не валидна. Стоит почитать про управление памятью в С\С++.
 
Но при чём здесь ShowMessage()?
Или её действия чисто случайны?
 
Конечно, случайны. Видимо где-то что-то не подчистилось ещё, поэтому вы и успеваете скопировать.
 
При чем здесь случайность? когда вызывается ShowMessage, строка еще валидная, после выхода из F1 - уже нет.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab