Я заметил, что строковые литералы имеют очень разные адреса в памяти, чем другие константы и переменные (ОС Linux): у них много ведущих нулей (не напечатано).
Пример:
const char *h = "Hi";
int i = 1;
printf ("%p\n", (void *) h);
printf ("%p\n", (void *) &i);
Вывод:
0x400634
0x7fffc1ef1a4c
Я знаю, что они хранятся в части .rodata
исполняемого файла. Есть ли особый способ, которым ОС обрабатывает его впоследствии, поэтому литералы попадают в специальную область памяти (с ведущими нулями)? Есть ли преимущества в этом месте памяти или есть что-то особенное?