2015-04-14 3 views
1
#include <iostream> 

int main() { 
    const char* s = nullptr; 
    { 
     s = "inner"; 
    } 
    std::cout << s << std::endl; 
    return 0; 
} 

Где находится "internal", хранящийся в памяти?Const C-String на стеке?

Valgrind не жалуется. Сохраняется ли в сегменте данных?

Спасибо.

+2

Скорее всего, родата или эквивалент, но такая вещь * очень * зависит от платформы. Стандарт C++ заботится только о том, что он имеет статическую продолжительность хранения. Какую платформу вы используете? – Wintermute

+0

@Bregalad это вопрос на C++. Также есть случаи, когда массив не распадается на указатель на обоих языках, например, когда он является операндом '&' или 'sizeof'. –

+0

Только указатель '' 'находится в стеке. Строка, указывающая на «внутреннюю», может быть где угодно. – Galik

ответ

2

В соответствии с С ++ Стандартный

8 Обычные строковых литералов и UTF-8 строковых литералов также называют как узкие строковых литералов. Узкий строковый литерал имеет тип «array of n const char», где n - размер строки, как определено ниже, и имеет статическую продолжительность хранения (3.7).

Так, хотя строка символов в вашей порграмме используются во внутреннем блоке основного

{ 
    s = "inner"; 
} 

он жив, пока программа не закончит ее выполнение и вся память процесса будут освобождены.

Обычно строковые литералы помещаются в сегмент данных только для чтения.

1

Это похоже на:

static const char t[] = "inner"; 

s = t; 

Таким образом, обратитесь к документации вашей реализации за то, что он делает с static const данных. В некоторых реализациях это .text или .rodata. Некоторые реализации могут хранить строковые литералы в другой области, чем другие статические данные const.

1

Valgrind не жалуется.

Это потому, что в коде нет ничего плохого: s остается в сфере. Кудрявые скобки вокруг места, где вы назначаете постоянное значение s, не влияют на поток вашей программы, потому что они не содержат деклараций.

Где находится "internal", хранящийся в памяти?

Ответ зависит от платформы. Он обычно хранится вместе с кодом вашей программы, но есть платформы, где строковые константы должны быть скопированы в другой блок памяти перед использованием (например, на оборудовании, которое использует Гарвардская архитектура, которая хранит программы и данные в отдельных адресных пространствах) ,

В любом случае память, выделенная для строковых литералов, не восстанавливается до конца вашей программы.

1

Вы можете попробовать простой тест: попробуйте использовать strcpy для записи в const string memory.

Скорее всего, у вас возникнет ошибка сегментации в Linux.

Поэтому, конечно, он не находится в стеке, а не в сегменте данных. Остальные сегменты кода или другой сегмент только для чтения, что является очевидным ответом.

, если вы хотите, чтобы знать наверняка, генерировать файл карты путем придания GCC флаг ссылки следующим образом:

-Wl,-Map=output.map

там вы можете увидеть, где именно сопзИте строка была сохранена.

Смежные вопросы