Разница между массивом и указателем [дубликат]

На этот вопрос уже есть ответ здесь:

Почему запись в строковый литерал в этой программе на Си сегфо? 6 ответовКакие'не так с моей strcpy? [закрыто] 4 ответа

Вчера у меня были небольшие проблемы с домашним "зЬгср» функция. Это работает сейчас, хотя яЯ немного смущен!

char* a = "Hello, World!"; //Works
char b[] = "Hello, World!"; //Works also

strcpy(a, "Hello!"); //Segmentation fault
strcpy(b, "Haha!!"); //Works..

В чем разница? Почему указатель на символ вызывает "Ошибка сегментации "?

Почему это даже работает? :

char* a = "Haha"; //works
a = "LOL"; //works..
 Benjamin Bannier22 мая 2013 г., 15:33
Я удалил тег C ++, так как речь идет о подмножестве C (и даже там вы нереализоватьstrcpy сам).
 Grijesh Chauhan12 окт. 2013 г., 12:54
 Claudio22 мая 2013 г., 15:23
Прочитайте этот раздел C FAQ:c-faq.com/aryptr/aryptr2.html
 Normal People Scare Me22 мая 2013 г., 19:50
@ honk да, это имеет смысл

Ответы на вопрос(2)

Решение Вопроса
char* a = "Hello, World!";

твовать в постоянной памяти, поэтому его содержимое нельзя изменить.

char* a = "Haha"; //works
a = "LOL"; //works..

меняет указательa чтобы указать на другой строковый литерал. Это нене пытайтесь изменить содержимое любого строкового литерала, поэтому это безопасно / правильно.

char b[] = "Hello, World!"

объявляет массив в стеке и инициализирует его содержимым строкового литерала. Память стека доступна для записи, поэтому ее содержимое можно безопасно изменять.

 Imre Kerr22 мая 2013 г., 15:24
Ну, этос неопределенным поведением, поэтому оно может работать или не работать. Мой совет всегда предполагать, что это победилот.
 Normal People Scare Me22 мая 2013 г., 15:24
Спасибо вам, ребята. Симонк, ты мне очень помог!
 Medinoc22 мая 2013 г., 15:40
Компилирование с-Wwrite-strings скажет gcc запомнить, что константные строковые литералы: Это предупредит вас об этом коде.
 simonc22 мая 2013 г., 15:24
@NormalPeopleScareMe Это зависит от того, на что он указывает. Вы можете'Изменить содержимое указателя на строковый литерал, но вы можете изменить содержимое указателя на выделенную строку стека или кучи.
 user101983022 мая 2013 г., 15:23
@NormalPeopleScareMe That 'верно. Это'указывает на строкупостоянная.
 Normal People Scare Me22 мая 2013 г., 15:22
поэтому я не могу изменить даже один символ в указателе символа, верно?

поскольку вы пытаетесь записать в постоянную память, указанную символом a, вы получите ошибку сегментации. Если вы хотите использовать указатели, затем выделите память в куче, используйте и удалите ее после ее использования. Где, как b это массив символов, инициализированный с "Привет, мир!".

Во втором примере вы делаете указатель, указывающий на другой строковый литерал, что должно быть хорошо.

 Normal People Scare Me22 мая 2013 г., 19:59
Я считаю этот ответ очень полезным. Я не'Не знаю, что строковый литерал находится в постоянной памяти. Также я нашел урок, как использовать указатели на символы в сочетании со strcpy, что вызвало ошибку сегментации, и они выделяли память, и я не смогне проследить, почему они это сделали. Благодарю.

Ваш ответ на вопрос