Когда вы делаете
char wrong[20] = "la1 4yt";
компилятор копирует элементы строкового литерала {'l', 'a', '1', ' ', '4', 'y', 't', '\0'}
в соответствующие элементы массива wrong
; когда вы делаете
char *wrong = "la1 4yt";
компилятор присваивает wrong
адрес строкового литерала.
Строковые литералы char[]
(массивы символов), а не const char[]
... но вы не можете их изменить !!
Цитата из стандарта:
6.4.5 String literals
6 It is unspecified whether these arrays are distinct provided
their elements have the appropriate values. If the program
attempts to modify such an array, the behavior is undefined.
Когда я использую строковый литерал для инициализации char *
, я обычно также говорю компилятору, что не буду изменять содержимое этого строкового литерала, добавляя const
к определению.
const char *wrong = "la1 4yt";
Редактировать
Предположим, у вас было
char *test1 = "example test";
char *test2 = "test";
И компилятор создал 1 однострочный литерал и использовал этот однострочный литерал для инициализации test1 и test2. Если вам было разрешено изменить строковый литерал ...
test1[10] = 'x'; /* attempt to change the 's' */
printf("%s\n", test2); /* print "text", not "test"! */