Задать вопрос
Dyikot
@Dyikot

Данные в таком случае будут хранится в стеке?

const int* Number = &static_cast<const int&>(1);
Так можно было всегда? Случайно открыл для себя. Всегда думал либо может указывать на lvalue либо на данные из кучи.
  • Вопрос задан
  • 127 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
В наше время можно просто проверить: godbolt.org

И clang и g++ и при локальном и при глобальном объявлении кладут 1 на стек.
Правда, clang чуть поумнее и выдает warning:
warning: temporary whose address is used as value of local variable 'Number' will be destroyed at the end of the full-expression [-Wdangling]


Нельзя надеяться, что по этому адресу останется лежать 1. В более сложных случаях этот адрес может быть переиспользован под что-то еще. Обращение по такому указателю - UB.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Не пиши так, пожалуйста.
Перед нами продление жизни временного объекта.
Когда ссылка исчезнет — а она исчезнет после точки с запятой — указатель будет смотреть в никуда, и только от Ктулху зависит, когда переменную перезапишут.
Правильно так:
const int& ref = 1;
const int* Number = &ref;

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

В общем, правило. Продлённый объект живёт, пока живёт та ссылка, что его продлила. Ссылки и указатели, что сделаны уже из этой ссылки, не в счёт: Си++ всё-таки не «мусорный» язык. Временный объект живёт до точки с запятой, за исключением нескольких случаев: явная команда придержать объект (о которой у нас и речь), создание/копирование массива (для простоты компиляции и чтобы не раздувать стек), с Си++23 в команде «цикл по объекту» ради безопасности и предсказуемости.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
15432
@15432
Системный программист ^_^
Данные будут храниться в сегменте .rodata или .text
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Если это определение внутри функции/метода - то Number будет лежать на стеке.
Если вне функции/метода - в области глобальных данных.
А вот данные на которые указывает Number могут лежать где угодно.
Да, указатель может указывать и на данные на стеке или в глобальной области. В общем на любой выделенный блок памяти он может указывать. А в вашем примере даже и не на выделенный, только обращаться по такому указателю нельзя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы