Следующий код указывает на первый символ в массиве символов, ansible в памяти только для чтения. Это правильно?:
const char * ptr = "String one";
Теперь, когда ptr
начинает указывать на другое место памяти:
ptr = "String two";
Что происходит с первым массивом символов ? Это освобождение памяти освобождается при завершении выполнения?
Стандарт только говорит о том, что строковые литералы имеют статическую продолжительность хранения , а это означает, что время жизни переменной до завершения программы и инициализируется при запуске программы. Соответствующий раздел в проекте стандарта С11 – пункт 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.
Вы можете запустить его здесь