Скажем, у меня есть простая функция, которая возвращает строку C следующим образом:
const char * getString()
{
const char * ptr = "blah blah";
return ptr;
}
и я вызываю getString() из main() следующим образом:
const char * s = getString();
1) В соответствии с gdb переменная ptr сохраняется в стеке, но строка, на которую указывает ptr, не соответствует:
(gdb) p &ptr
$1 = (const char **) 0x7fffffffe688
(gdb) p ptr
$2 = 0x4009fc "blah blah"
Означает ли это, что "бла-бла" не является локальной переменной внутри getString()?
Я предполагаю, что если бы это была локальная переменная, я бы не смог передать ее моей функции main()... Но если это не так, то где оно хранится? На куче? Является ли это "своего рода" динамическим распределением памяти, реализованным ОС каждый раз, когда он попадает на строку, или что?
2) Если я использую массив вместо указателя, следующим образом:
const char *getString2()
{
const char a[] = "blah blah blah";
return a;
}
компилятор предупреждает меня, что:
warning: address of local variable ‘a’ returned
(и, конечно, программа компилируется, но она не работает).
Собственно, если я спрошу gdb, я получаю
(gdb) p &a
$2 = (const char (*)[15]) 0x7fffffffe690
Но я думал, что const char * ptr и const char a [] были в основном одинаковыми. Похоже, что это не так.
Неужели я ошибаюсь? Какая разница между двумя версиями?
Спасибо!