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 объявлен как локальный массив chars - и его содержимое будет помещено в стек функции. Стеки функций можно изменять, поэтому c1[0] = ... буду работать.

      char* c2 = "hello";

здесь есть тонкая разница - c2не массив, а указатель на строковый литерал. Его изменение является неопределенным поведением в соответствии со стандартом - на практике обычно происходит то, что "hello" строка помещается в исполняемый файл только для чтения .data раздел - и попытка изменить его вызывает ошибку страницы, которая приводит к сбою программы.

Другие вопросы по тегам