Когда вы пишете «строку» в исходном коде, она записывается непосредственно в исполняемый файл, потому что это значение необходимо знать во время компиляции (существуют инструменты, позволяющие разделить программное обеспечение и найти в нем все строки простого текста). ). Когда вы пишете char *a = "This is a string"
, местоположение «Это строка» находится в исполняемом файле, а местоположение, на которое указывает точка, находится в исполняемом файле. Данные в исполняемом образе доступны только для чтения.
Что вам нужно сделать (как указано в других ответах) - создать эту память в месте, которое не только для чтения - в куче или в кадре стека. Если вы объявляете локальный массив, то в стеке создается место для каждого элемента этого массива, а строковый литерал (который хранится в исполняемом файле) копируется в это пространство в стеке.
char a[] = "This is a string";
Вы также можете скопировать эти данные вручную, выделив часть памяти в куче, а затем используя strcpy()
, чтобы скопировать строковый литерал в это пространство.
char *a = malloc(256);
strcpy(a, "This is a string");
Всякий раз, когда вы выделяете пространство с помощью malloc()
, не забывайте вызывать free()
, когда закончите с ним (читай: утечка памяти).
По сути, вы должны отслеживать, где находятся ваши данные. Всякий раз, когда вы пишете строку в своем источнике, эта строка доступна только для чтения (в противном случае вы могли бы потенциально изменить поведение исполняемого файла - представьте, что вы написали char *a = "hello";
, а затем изменили a[0]
на 'c'
. printf("hello");
. Если вам было разрешено изменить первый символ "hello"
, и ваш компилятор сохранил его только один раз (так и должно быть), то printf("hello");
выдаст cello
!)