Во втором вы делаете копию.В первом случае вы не.
char str[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
Здесь str
- массив, созданный в стеке.До str
содержимое копируется.Как бы то ни было -
char *str = "hello word";
str
указывает на данные, находящиеся в неизменяемой секции.Таким образом, вы не можете, и когда попытался результаты ошибки сегментации.
Описание для комментариев
Не думаю, для примитивных типов данных C иС ++ меняет свои правила.Из ИСО / МЭК 14882: 2003 (E) Раздел 8.5.2
1. A char array (whether plain char, signed char, or unsigned char) can be
initialized by a string- literal (optionally enclosed in braces); a wchar_t
array can be initialized by a wide string-literal (option- ally enclosed in
braces); successive characters of the string-literal initialize the members of
the array.
[Example:
char msg[] = "Syntax error on line %s\n"; shows a character array
whose members are initialized with a string-literal. Note that because
’\n’ is a single character and because a trailing ’\0’ is appended,
sizeof(msg) is 25.
]
2. There shall not be more initializers than there are array elements.
[Example:
char cv[4] = "asdf" ;// error is ill-formed since there is no space for the implied trailing ’\0’.
]
Итак, пример 2 устраняет сомнение.