В первом примере указатель t
сделан для указания на константу строки "Hello"
, а затем сразу же после этого на константу строки "World"
; последнее значение затем печатается.
Код во втором примере сбой с segfault, поскольку строковые константы не могут быть записаны. (strcpy пытается изменить память, содержащую текст "Hello"
). GCC помещает строковые константы в раздел только для чтения, если не скомпилирован с -fwriteable-strings
.
Код
char *test = "Hello";
означает, что компилятор + компоновщик место строка байтов «Hello \ 0» в режиме только для чтения раздела, и test
точки в первый символ его. Любая попытка написать через этот указатель будет жестко наказана операционной системой.
С другой стороны
char test[] = "Hello";
объявляет массив из 6 символов, с начальным значением ({ 'H', 'e', 'l', 'l', 'o', '\0' }
).
Некоторые старые программы предполагали, что строковые константы можно записать; поэтому GCC поддерживает компиляцию этих программ с помощью переключателя командной строки -fwriteable-strings
.
Я использую gcc-компилятор – user2076561
'char * t =" Hello ";" - это указатель, который указывает на строковый литерал. Вы можете свободно назначить его другому строковому литералу, но не можете «хранить» некоторые данные (строка например, в этой памяти.Это была суть ответа, ниже которого я думаю, что кто-то занижен - если вы один из них - пожалуйста, перейдите и верните его обратно. –