Сегфоут означает, что что-то не так.Но no segfault не означает, что что-то не является неправильным.Если две ситуации в основном одинаковы, а одна - с ошибками, а другая - нет, это обычно означает, что они оба неверны, но только одна из них вызывает ошибку segfault.
Глядя на строку char* incall[10]
, это означает, что у вас есть массив из 10 указателей на символ.По умолчанию эти указатели будут указывать на случайные места.Поэтому при входе в incall [0] строка будет скопирована в произвольное место.Скорее всего, это будет Segfault!Сначала вам нужно инициализировать incall [0] (используя malloc
).
Итак, более важный вопрос: почему не segfault первой строки?Я предполагаю, что причина в том, что просто так происходит , что все, что было в памяти раньше, было действительным указателем.Таким образом, strcpy не переходит в segfault, он просто перезаписывает что-то еще, что впоследствии вызывает совершенно неожиданное поведение.Поэтому вы должны исправить обе строки кода.
Другая проблема (после того, как вы исправили это) заключается в том, что strcpy
сам по себе очень опасен - поскольку он копирует строки, пока не найдет 0Байт, а затем останавливается, вы никогда не можете быть точно уверены, сколько именно он будет копировать (если только вы не используете strlen
для выделения целевой памяти).Так что вместо этого вы должны использовать strncpy
, чтобы ограничить количество копируемых байтов размером буфера.