Ответ слегка зависит от реализации, но в целом нет. Ваш g_glbarr
действительно является указателем на char
или адресом. Сама строка будет помещена в раздел данных с постоянными строками, и g_glbarr
станет символом адреса строки во время компиляции. Вы не заканчиваете тем, что выделяете место для указателя, и компилятор просто разрешает адрес во время ссылки.
Обновление
@ Джей, вроде как то же самое. Целые числа (как правило) просто встроены: компилятор подойдет как можно ближе к простой константе в коде, потому что это настолько распространенный случай, что большинство нормальных архитектур имеют простой способ сделать это из непосредственных данных. Строковые константы все еще будут находиться в некотором разделе данных только для чтения. Поэтому, когда вы делаете что-то вроде:
// warning: I haven't compiled this and wouldn't normally
// do it quite this way so I'm not positive this is
// completely grammatical C
struct X {int a; char * b; } x = { 1, "Hello" } ;
1
становится "непосредственными" данными, "Hello"
выделяется где-то в данных только для чтения, и компилятор просто генерирует что-то, что выделяет часть данных для чтения-записи, которая выглядит примерно как
x:
x.a: WORD 1
x.b WORD @STR42
где STR42
- символическое имя для расположения строки "Hello"
в памяти. Затем, когда все связано, @STR42
заменяется фактическим виртуальным адресом строки в памяти.