Это не из-за strcpy()
- он делает одно и то же в обоих случаях: он копирует последовательно символы из источника в соответствующие позиции в месте назначения до \0
в конце исходной строки.
Причина, по которой вы получаете ошибку сегментации во втором случае, заключается в том, что эти строковые литералы теперь находятся в другом сегменте памяти, который только для чтения (например, это может быть вместе с скомпилированной программой текст). Когда strcpy()
пытается ввести туда символы, ваш процесс прерывается, и ядро говорит вам: «Вы не можете этого сделать, вы нарушаете сегментацию памяти» (отсюда нарушение сегментации или ошибка).
В случае first эти строковые литералы, доступные только для чтения, все еще существуют, но вы используете их для инициализации локальной переменной - (двумерного) массива, который находится в стеке. Двумерный массив - это , а не массив указателей, на самом деле это массив символов, и C просто «организует» доступ к этому массиву, так что вы можете использовать пары квадратных скобок.
См:
здесь, в StackOverflow, для более подробной информации по этим темам.