Массив нельзя присвоить , используя оператор =
.Это просто факт дизайна языка Си.Вы можете инициализировать массив в объявлении, например
char str[size] = "\x80\xbb\x00\xcd";
, но это операция, отличная от присваивания. И обратите внимание, что в этом случае дополнительный '\ 0' будет добавлен в конец строки.
Предупреждение "несовместимые типы" исходит из того, как выражения массива обрабатываютсяязык.Прежде всего, строковые литералы хранятся в виде массивов char
со статическим экстентом (то есть они существуют на протяжении всей жизни программы).Таким образом, тип строкового литерала "\ x80 \ xbb \ x00 \ xcd" равен " 4 5-элементный массив из char
".Однако в большинстве случаев выражение типа массива будет неявно преобразовываться («распадаться») из типа «массив из N элементов из T» в «указатель на T», и значением выражения будет адрес первогоэлемент в массиве.Итак, когда вы написали оператор
str = "\x80\xbb\x00\xcd";
, тип литерала был неявно преобразован из " 4 5-элементного массива char
" в "указатель на char
", но целью назначения является тип "массив из 100 элементов char
", а типы несовместимы (помимо того факта, что выражение массива не может быть целью оператора =
).
Чтобы скопировать содержимое одного массива в другой, вам потребуется использовать библиотечную функцию, такую как memcpy
, memmove
, strcpy
и т. Д. Кроме того, для правильной работы strcpy
источникСтрока должна быть 0-концевой.
Редактировать за комментарий R ниже, я вычеркнул более тупые разделы моего ответа.