C Указатель на массивы [дубликат]
Я изучаю указатели на C. Когда я объявляю:
char c1[] ="hello";
c1[0] = c1[1];
printf("%s\n", c1);
Он распечатывает
eello
Но когда я делаю следующее:
char * c2="hello";
c2[0] = c2[1];
printf("%s\n", c2);
он компилируется на C #, но программа вылетает. Не могли бы вы помочь мне прояснить, что происходит в стеке, когда я выполняю программу?
1 ответ
char c1[] ="hello";
В этой строке кода
c1
объявлен как локальный массив
char
s - и его содержимое будет помещено в стек функции. Стеки функций можно изменять, поэтому
c1[0] = ...
буду работать.
char* c2 = "hello";
здесь есть тонкая разница -
c2
не массив, а указатель на строковый литерал. Его изменение является неопределенным поведением в соответствии со стандартом - на практике обычно происходит то, что
"hello"
строка помещается в исполняемый файл только для чтения
.data
раздел - и попытка изменить его вызывает ошибку страницы, которая приводит к сбою программы.