Я заметил, что строковые литералы имеют очень разные адреса в памяти, чем другие константы и переменные (ОС Linux): у них много ведущих нулей (не напечатано).Почему адреса памяти строковых литералов настолько отличаются от других, на Linux?
Пример:
const char *h = "Hi";
int i = 1;
printf ("%p\n", (void *) h);
printf ("%p\n", (void *) &i);
Выход:
0x400634
0x7fffc1ef1a4c
Я знаю, что они хранятся в .rodata
части исполняемого файла. Есть ли особый способ, которым ОС обрабатывает его впоследствии, поэтому литералы попадают в специальную область памяти (с ведущими нулями)? Есть ли преимущества в этом месте памяти или есть что-то особенное в этом?
http://stackoverflow.com/questions/4560720/why-does-the-stack-address-grow-towards-decreasing-memory-addresses –
Все зависит от операционной системы, в которой он загружает код и где он выделяет стек. –
Очевидно, что данные, определенные реализацией, но данные RO (ваш литерал) часто загружаются на отдельные страницы, помеченные для запуска режима исключения по принципу защиты от записи. Значение: запись в него вызывает структурированное исключение. – WhozCraig