devices - это массив указателей.Вы копируете строку «smxxxx1» поверх массива, когда создается впечатление, что вы хотите установить элемент 0, чтобы он указывал на строку.
Вместо strcpy () try:
devices[0] = "smxxxx1"
или
devices[0] = strdup("smxxxx1")
Редактировать:
В 32-битной системе устройства [0] состоят из четырех байтов.Эти четыре байта перезаписываются байтовыми значениями первых четырех символов строки «smxxxx1».В ascii это 0x73, 0x6D, 0x78, 0x78.Предполагая адресацию little-endian , вы получите устройства [0], содержащие указатель на адрес 0x78786D73.Этот адрес почти наверняка не будет действительным в процессе.Когда вызов printf () пытается разыменовать этот недопустимый указатель, ОС вызывает ошибку сегментации и выдает дамп ядра.
Проблема заключалась в том, что OP неправильно обрабатывал переменную devices как строку (массив char), когдаинициализирую это.На самом деле это массив указателей на char, и printf () интерпретирует его как таковой.