Строковый литерал имеет тип char[]
.При использовании в большинстве контекстов строковый литерал (типа char[]
) затухает до указателя на свой первый элемент (он становится типом char*
).
Если ваш компилятор жалуется на присвоение значениятипа char*
(ваш ""
) для объекта типа char*
(ваш var1
), ваш компилятор сломан.
Или, скорее всего, вы его не вызываетекак компилятор 'C', но как компилятор языка, похожего на C, но не совсем C.
Попробуйте: gcc -Wno-write-strings ...
, чтобы отключить это конкретное расширение gcc: -)
Редактировать
Строковый литерал - это массив символов (типа char[]
), но его нельзя изменить.По историческим (или некоторым другим специфическим) причинам они не относятся к типу const char[]
, так как «массив неизменяемых символов» выглядит так, как и должно быть.
С опцией компилятора «-Wwrite-strings» gcc пытаетсябыть полезным и изменить определение строковых литералов.
Если вы хотите быть в безопасности и хотите, чтобы ваши строковые литералы были типа const char[]
, просто помните, что вы больше не компилируете C (C89, C90, C99,что угодно) и будь счастлив.Как сказали другие ответы: объявите ваши указатели как const
или скопируйте неизменяемые символы в изменяемые объекты.