Указатели на Const Char

Следующий код указывает на первый символ в массиве char, доступный в памяти только для чтения. Правильно?:

const char * ptr = "String one";

Теперь, когда ptr начинает указывать на другую ячейку памяти:

ptr = "String two";

Что происходит с первым массивом char? Является ли это место памяти освобожденным после завершения выполнения?

Ответ 1

Стандарт только говорит о том, что строковые литералы имеют статическую продолжительность хранения, а это означает, что время жизни переменной до завершения программы и инициализируется при запуске программы. Соответствующий раздел в проект стандарта C11 - это 6.4.5 пункт 6:

[...] Последовательность многобайтовых символов затем используется для инициализации массива статической продолжительности хранения и длины, достаточной для того, чтобы содержать последовательность. [...]

Он может быть в памяти только для чтения и, вероятно, есть, но это реализация определена. Его не нужно освобождать, только память, динамически распределенная через malloc, нуждается в последующем вызове free.

Если я использую эту программу:

int main()
{
    const char * ptr = "String one";

    return 0;   
}

и мы построим его с помощью gcc, а затем используем objdump:

objdump -s -j .rodata a.out

Мы обнаружим, что в этом случае он действительно хранится в разделе данных только для чтения:

Contents of section .rodata:
  400580 01000200 53747269 6e67206f 6e6500    ....String one. 

Вы можете запустить его самостоятельно здесь