Отказ сегментации с массивом символов и указателем в C на Linux

походит на случай, где Вы могли использовать стратегическая модель

15
задан ccoder 20 November 2009 в 20:33
поделиться

3 ответа

один указывает непосредственно на строку, расположенную на странице только для чтения. С другой стороны, two - это массив, размещенный в стеке и инициализируемый некоторыми постоянными данными. Во время выполнения строка в разделе исполняемого файла только для чтения будет скопирована в стек. Вы изменяете копию этой строки в стеке, а не страницу памяти только для чтения.

На более высоком уровне, с точки зрения языка, «abcd» является выражением типа const char * , а не char * . Таким образом, изменение значения, указанного таким выражением, приводит к неопределенному поведению. Оператор char * one = "something"; просто сохраняет указатель на строку в переменной (небезопасно, так как он отбрасывает модификатор const ). char two [] = "something"; совершенно другой. Фактически он объявляет массив и инициализирует его, как и int a [] = {1,2,3}; .

38
ответ дан 1 December 2019 в 01:05
поделиться

Вторая форма создает массив путем копирования литеральной строки.

Это эквивалентно:

char two[] = {'a', 'n', 'o', 't', 'h'. 'e', r', '\0'};

Вы можете инициализировать массив символов с помощью переменных, таких как

char c = 'a';
char two[] = {'a', 'n', c, '\0'};
0
ответ дан 1 December 2019 в 01:05
поделиться

«Другой», который вы видите в разделе родата, - это то, что будет скопировано в массив two , когда он будет инициализирован. С другой стороны, адрес строки «computer» будет назначен одному.

Итак, один указывает на сегмент только для чтения (и, следовательно, segfault при записи ), в то время как два будут размещены в стеке, а затем в него будет скопирован «еще один».

1
ответ дан 1 December 2019 в 01:05
поделиться