Вы вызываете неопределенное поведение, потому что вы пишете (или пытаетесь писать) за пределами выделенной памяти.
Другие придирки:
- Поскольку вы используете
strcpy()
вы копируете 7 байтов, а не 6, как вы заявляете в вопросе. - Ваш вызов
strcpy()
некорректен - вы передаете char
вместо указателя на char
в качестве первого аргумента. - Если ваш компилятор не жалуется, вы не используете достаточно вариантов предупреждений.Если вы используете GCC, вам нужно по крайней мере
-Wall
в командной строке компилятора. - Вы должны включить оба
<stdlib.h>
для malloc()
и <string.h>
для strcpy()
. - Вы также должны явно указать
int main()
(или, лучше, int main(void)
). - Лично я достаточно стар, чтобы предпочесть увидеть явное
return(0);
в конце main()
, даже если C99 следует C ++ 98 и позволяет вам его опустить.
Возможно, вам не повезло, и вы на некоторое время избегаете вызывать неопределенное поведение, но такой инструмент, как valgrind должен указать на ошибку ваших путей.На практике многие реализации malloc()
выделяют кратное 8 байт (а некоторые кратное 16 байтам), и, учитывая, что вы деликатно не перешагиваете 8-байтовое распределение, вы можете сойти с рук.Но хорошая отладка malloc()
или valgrind
покажет, что вы делаете это неправильно.
Обратите внимание, что, поскольку вы не free()
выделяете место, прежде чем вернуться из main()
, вы (относительно безобидно в этом контексте) утечка.Также обратите внимание, что если ваша скопированная строка была длиннее (скажем, до алфавита), особенно если вы пытались free()
выделенной памяти или пытались выделить другие фрагменты памяти после писанины после конца первого, то выс большей вероятностью увидит ваш код сбоя.
Неопределенное поведение безусловно плохо.Может произойти все, что угодно.Для его диагностики не требуется никакой системы.Избегайте этого!