Почему этот простой strcat сбой во время выполнения?

По какой-то причине после возвращения из-за лет программирования не CI не может выполнить эту работу:

(Это компилируется без каких-либо жалоб, но это приводит к сбою, когда я удаляю строку strcat, исполняемый файл отлично работает)

#include  #include  int main(int argc, char **argv){ char clibdir[50] = "C:\\Users\\______000\\Desktop\\nodeC\\libraries\\c"; char varsfile[20] = "\\variables.xml"; printf("%s\n", clibdir); //ok printf("%s\n", varsfile); //ok char *varspath = strcat(clibdir, varsfile); //this is provoking a crash printf("%s\n", clibdir); //prints right before crash printf("%s\n", varspath); //prints right before crash return 0; } 

Это печатает только отлично, но это сбой моего exe. Это моя командная строка (я использую cl.exe из Visual Studio 2010):

 "%vcbin%\vcvars32.bat" && "%vcbin%\cl.exe" /nologo /EHsc main.cpp /link /subsystem:console 

Ваш код сбой, потому что вы не выделили достаточно места в clibdir чтобы сохранить начальную строку и добавленную строку, так что у вас есть переполнение буфера. Проблема в том, что вы удалили стек возврата из функции main() , поэтому программа переходит в режим haywire и сбой при возврате из main() программы. Вероятно, вы обнаружите, что если вы заменили return 0; с exit(0); , ваша программа больше не сработает. Это совпадение – не рекомендуемое исправление.

Мораль истории – «убедитесь, что у вас достаточно места для строк, которые вы добавляете»!

Правильное исправление заключается в увеличении размера clibdir от 50 до не менее 60.


… И … когда вы задаете вопрос, убедитесь, что код, который вы показываете в вопросе, фактически сработает так же, как и код, который вы используете на вашем компьютере. Исходная версия вопроса:

 char clibdir[50] = "\\libraries\\c"; 

вместо:

 char clibdir[50] = "C:\\Users\\______000\\Desktop\\nodeC\\libraries\\c"; 

и никто не мог понять, почему код рушился – потому что, действительно, исходный код не должен терпеть крах.