походит на случай, где Вы могли использовать стратегическая модель
один
указывает непосредственно на строку, расположенную на странице только для чтения. С другой стороны, two
- это массив, размещенный в стеке и инициализируемый некоторыми постоянными данными. Во время выполнения строка в разделе исполняемого файла только для чтения будет скопирована в стек. Вы изменяете копию этой строки в стеке, а не страницу памяти только для чтения.
На более высоком уровне, с точки зрения языка, «abcd»
является выражением типа const char *
, а не char *
. Таким образом, изменение значения, указанного таким выражением, приводит к неопределенному поведению. Оператор char * one = "something";
просто сохраняет указатель на строку в переменной (небезопасно, так как он отбрасывает модификатор const
). char two [] = "something";
совершенно другой. Фактически он объявляет массив и инициализирует его, как и int a [] = {1,2,3};
.
Вторая форма создает массив путем копирования литеральной строки.
Это эквивалентно:
char two[] = {'a', 'n', 'o', 't', 'h'. 'e', r', '\0'};
Вы можете инициализировать массив символов с помощью переменных, таких как
char c = 'a';
char two[] = {'a', 'n', c, '\0'};
«Другой», который вы видите в разделе родата, - это то, что будет скопировано в массив two
, когда он будет инициализирован. С другой стороны, адрес строки «computer» будет назначен одному.
Итак, один
указывает на сегмент только для чтения (и, следовательно, segfault при записи ), в то время как два
будут размещены в стеке, а затем в него будет скопирован «еще один».