расположение переменных в стеке без использования (&) - PullRequest
1 голос
/ 28 февраля 2011

Я пытаюсь определить способ проверки местоположения переменных в стеке (не делая этого, исходя из здравого смысла).

   int main()
    {
      int i,j;
      return 0;
    }

в действительности нет никакой разницы между утверждением int i;INTJ;и int i, j;Я могу сказать, просто cout'ing адреса.я иду в стек, затем j идет в стек.Но в любом случае, я мог бы сказать это без использования оператора адреса памяти (или указателей).

это конкретное назначение.Вероятно, чтобы я мог понять причину, почему стек реализован таким образом.Я могу легко определить, как они расположены (и да, это зависит от компилятора, но для простоты gcc).

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

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

Ответы [ 5 ]

4 голосов
/ 28 февраля 2011

Таким образом, вы хотите найти адреса локальных переменных без использования оператора C, специально предназначенного для поиска адреса переменной.Почему?

Стоит отметить, что в любой современной комбинации компилятор / процессор i и j в вашем примере могут не находиться в стеке, если вы не используете оператор &.Даже если вы что-то с ними делаете, чтобы компилятор не оптимизировал их, он все равно может поместить их в регистры.


Редактировать: Я прочитал ваш комментарийна ответ свидания, и я думаю, что знаю, о чем вас просят.Вот возможный ответ, но я должен подчеркнуть, что я делаю большие предположения о вашем компиляторе.В частности,

  • все переменные хранятся в стеке
  • переменные не оптимизированы (отключите все оптимизации в вашем компиляторе).
  • область памяти дляавтоматические массивы распределяются непосредственно в стеке
  • стек не очищается между вызовами функций

Если у вас есть такая функция:

int f()
{
    int i = 1, j = 2;
    return 0;
}

ВыМожно проверить порядок i, j в памяти с помощью этой функции:

void order()
{
    int a[2];
    if (a[0] == 1)
    {
        printf("i first\n");
    }
    else
    {
        printf("j first\n");
    }
}

int main()
{
    f();
    order();
    return 0;
}

Никогда не используйте ничего подобного в реальном коде.Он опирается на несколько частей официально неопределенного поведения.

3 голосов
/ 28 февраля 2011

AFAIK Нет гарантий порядка ни в стандартах C, ни в C ++.т. е. хотя вы можете не обнаружить никаких отличий, вполне возможно, что различия будут при использовании другого компилятора или других (оптимизационных) настроек.(на самом деле оптимизатор может также переупорядочить i и j или полностью удалить их)

Так что да, вам нужно использовать «адрес».Почему бы тебе?

3 голосов
/ 28 февраля 2011

Нет, вы должны использовать оператор &, чтобы получить адрес переменной.

2 голосов
/ 28 февраля 2011

Почему вы хотите это сделать?Расположение i и j в стеке зависит от реализации.На самом деле, во многих реализациях i и j не будут занимать места в вашем примере, потому что они никогда не используются.Единственный способ узнать наверняка - посмотреть на сгенерированный код (который будет другим, если вы используете адреса своих переменных).

1 голос
/ 28 февраля 2011

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

Черт, даже оператор & является чисто абстрактным, и возвращаемое им значение в его числовом представлении может быть любым, если оно придерживается правил арифметики указателей. Но это число, оно может быть полностью виртуальным и никак не связано с адресами, используемыми в инструкциях.

Таким образом, хотя задача определения, находится ли переменная в стеке, хорошо определена, по определению невозможно реализовать с использованием чистого ANSI C, не опираясь на поведение, специфичное для реализации. Обычный способ выполнить эту задачу - выполнить обход стека, предоставляемый функциями библиотеки времени выполнения реализаций.

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

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