Важный момент, который выводится, но не указывается явно:
Исходя из вашего вопроса, я предполагаю, что вы довольно плохо знакомы с программированием на C, поэтому я хотел бы немного подробнее рассказать о вашей ситуации. Прости меня, если я ошибаюсь; C трудно усвоить, в основном из-за тонкого недопонимания в базовых механизмах, поэтому я хотел бы сделать вещи максимально понятными.
Как вы знаете, когда вы пишете свою C-программу, компилятор предварительно создает все для вас на основе синтаксиса. Когда вы объявляете переменную в любом месте вашего кода, например:
int x = 0;
Компилятор читает эту строку текста и говорит самому себе: ОК, мне нужно заменить все вхождения в текущей области кода x
постоянной ссылкой на область памяти, которую я выделил для хранения целого числа.
Когда ваша программа запускается, эта строка приводит к новому действию: мне нужно установить область памяти, на которую x
ссылается на int
значение 0
.
Обратите внимание на тонкую разницу: ячейка памяти, которую держит опорная точка x
, является постоянной (и не может быть изменена). Однако значение, которое x
указывает, может быть изменено. Вы делаете это в своем коде через присваивание, например x = 15;
. Также обратите внимание, что одна строка кода на самом деле составляет две отдельные команды для компилятора.
Когда у вас есть заявление вроде:
char *name = "Tom";
Процесс компилятора выглядит следующим образом: ОК, мне нужно заменить все вхождения в текущей области кода name
постоянной ссылкой на область памяти, которую я выделил для хранения значения указателя char
. И это так.
Но есть второй шаг, который сводится к следующему: мне нужно создать постоянный массив символов, который содержит значения 'T', 'o', 'm' и NULL
. Затем мне нужно заменить часть кода, которая говорит "Tom"
, адресом памяти этой константной строки.
Когда ваша программа запущена, происходит последний шаг: установка указателя на значение char
(не постоянное) на адрес памяти этой автоматически создаваемой строки (которая является константой) ).
То есть char *
не только для чтения. Только const char *
только для чтения. Но ваша проблема в этом случае не в том, что char *
s доступны только для чтения, а в том, что ваш указатель ссылается на области памяти, доступные только для чтения.
Я поднимаю все это, потому что понимание этой проблемы - это барьер между тем, как вы смотрите на определение этой функции из библиотеки и сами понимаете проблему, а не спрашиваете нас. И я несколько упростил некоторые детали в надежде сделать проблему более понятной.
Надеюсь, это было полезно. ;)