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

жный дубликат:
В чем разница между char s [] и char * s в C?

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

char amessage[] = "blah";
char *pmessage = "blah";

Разница в том, что один является массивом символов, а другой - указателем на строковую константу. Они говорят, что изменение массива char допустимо, но вы не должны изменять строковые константы, так как это вызывает неопределенное поведение. Мой вопрос: не хранится ли строковая константа в памяти так же, как массив char? Почему я могу изменить его, как в

char *p = "this is a string constant";
*(p+2) = 'a';
printf("%s", p);

Завершает печать «это строковая константа», как и следовало ожидать. Я могу понять, как это будет иметь смысл в виде строкипостоянная не должно заканчиваться изменением во время выполнения, так как это может запутать других / вас, работающих над вашим кодом, не ожидая, что его значение изменится, но с чисто функциональной точки зрения, что с ним не так, что такое неопределенное поведение, которое может сработать, и как это происходит механически может ли иметь неприятные последствия, когда массив символов не будет? Мне просто интересно, если я что-то упускаю из-за того, как строковые константы работают в памяти и как они видятся компилятором.

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

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