Как изменить символ в строке с помощью указателей? - PullRequest
3 голосов
/ 14 июля 2011

У меня проблемы с этим кодом

int main() {
     char *My_St = "abcdef";
     *(My_St+1)='+';
     printf("%s\n",My_St);
     return 0;
}

Я создал этот код и не обнаружил ошибок, но когда я пытаюсь запустить его, он выдает ошибку сегментации, может кто-нибудь сказать, что не так

Ответы [ 4 ]

6 голосов
/ 14 июля 2011

Вы не можете, потому что вы пытаетесь изменить константные данные.

изменить на:

char My_St[] = "abcdef";

Тогда вы сможете изменить его.

Подумайте о том, что вы делали, вы объявили указатель , который указывал на "abcdef". Это указатель, , а не массив символов. "abcdef" живет на ферме, я имею в виду, в области .text вашей программы, и это неизменно.

Когда вы делаете это так, как я показал, вы говорите компилятору: я объявляю этот массив, в котором будет столько символов, сколько необходимо для размещения "abcdef", а также, как вы, копируете "abcdef" к нему.

3 голосов
/ 14 июля 2011

Вы предоставили подсказку компилятору, объявив My_St с типом char *.Присвоение строкового литерала этому указателю, по сути, делает его const char *, поскольку строковый литерал не может быть изменен, то есть область памяти доступна только для чтения.Запись в эту область памяти только для чтения - это то, что порождает вашу ошибку.Измените его с char *My_St на char My_St[], чтобы оно заработало.

2 голосов
/ 14 июля 2011

char * My_St относится к постоянной памяти, скорее всего.Вам нужно будет динамически распределить вашу строку и затем заполнить ее (используя strcpy).

char *str = malloc(7);
strcpy(str, "abcdef");

или

char *str = strdup("abcdef");

И тогда будет безопасно изменить str.

0 голосов
/ 14 июля 2011

Основы верны, однако ваша строка символов (за кадром) постоянна и не может быть изменена. Вам нужно будет определить массив символов (например, char[20]), скопировать в него строку и затем изменить символ.

Чтобы быть на 100% правильным, вам нужно написать const char *My_St = "abcdef";, чтобы было ясно, что вы не можете делать то, что пытаетесь сделать.

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