Как уже указывалось, попытка изменить постоянную строку в C приводит к неопределенному поведению.Для этого есть несколько причин.
Одной из причин является то, что строка может быть помещена в постоянную память.Это позволяет использовать его для нескольких экземпляров одной и той же программы и не требует сохранения памяти на диск, если страница, на которой он находится, выгружается (поскольку страница доступна только для чтения и, следовательно, может быть перезагружена позже изисполняемый файл).Он также помогает обнаруживать ошибки времени выполнения, выдавая ошибку (например, ошибку сегментации), если предпринята попытка изменить ее.
Другая причина заключается в том, что строка может использоваться совместно.Многие компиляторы (например, gcc
) заметят, когда одна и та же буквальная строка появляется более одного раза в модуле компиляции, и будут использовать одно и то же хранилище для нее.Поэтому, если программа изменяет один экземпляр, это может повлиять и на другие.
Нет также необходимости в этом, поскольку тот же намеченный эффект может быть легко достигнут с помощью статического массива символов.Например:
#include <stdio.h>
int main(void) {
static char st_arr[] = "aaa";
char *st = st_arr;
*st = 'b';
return 0;
}
Это именно то, что пытался сделать размещенный код, но без какого-либо неопределенного поведения.Это также занимает столько же памяти.В этом примере строка "aaa"
используется в качестве инициализатора массива и не имеет собственного хранилища.Массив st_arr
занимает место строки констант из исходного примера, но (1) он не будет помещен в постоянную память и (2) он не будет использоваться совместно с любыми другими ссылками на строку.Так что это безопасно изменить, если на самом деле это то, что вы хотите.