Переменная, объявленная взаимозаменяемо, имеет тот же шаблон адреса памяти

0

У меня есть функция, и в функции у меня есть две переменные,

  int auth_flag = 0;
  char buffer[16];

Теперь вот вывод x/s buffer команды gdb

0xffffd01c: "\201\203\004\b\344\203\373\367\002"

и вывод print &auth_flag

$1 = (int *) 0xffffd018

Теперь из вывода видно, что местоположение auth_flag составляет 4 байта перед буфером. Теперь, если я объявляю такие переменные, как это

char buffer[16];
int auth_flag = 0;

вывод предыдущих команд

0xffffd00c: "\201\203\004\b\344\203\373\367\002" and
$1 = (int *) 0xffffd008

Тоже самое. 100 байт, но порядок тот же. Мои qs есть. Поскольку я изменил объявление переменной, почему в gcc адресный порядок переменной не изменился. Я читаю книгу, где говорится, что адрес должен быть отменен, но этого не происходит в моем компьютере. Поэтому я действительно смущен.

  • 0
    Может быть, не форсирует оптимизацию? #pragma OPTIMIZE OFF
  • 0
    @Leonardo: Леонардо: Исключительно ужасная идея. Даже если это работает в этом одном случае, это вводит в заблуждение, поскольку язык не дает никаких гарантий относительно того, где компилятор размещает автоматические переменные.
Теги:
gdb

1 ответ

4
Лучший ответ

Запишите эту книгу, если она говорит, что автоматические переменные имеют какое-либо конкретное отношение адресов друг к другу в стандарте C или C++. Поля в struct или class имеют макет, определенный реализацией. Автоматические переменные даже не гарантируются для выделения памяти.

Теперь, что гарантирует C++, порядок, в котором определены символы (конструкция времени компиляции, а не проблема макета памяти) и какие конструкторы заказов вызываются. Например, этот порядок определяет, что означает следующий код в точный способ:

int foo(int x)
{
    int y = x;  // this sees the argument x
    int x = 3;  // this defines an automatic variable named x that shadows the argument

    return x + y;
}

C++ также предоставляет гарантии порядка строительства и уничтожения объектов. (Построены, когда они попадают в сферу действия по внешнему виду, разрушаются в обратном порядке строительства, поскольку они оставляют объем.) Но я не буду глубоко вникать в это, поскольку это выходит за рамки вашего вопроса.

  • 0
    Эти переменные находятся в функции.
  • 0
    Переменные, локальные для функции, являются автоматическими переменными. Они обычно (но не всегда) размещаются в стеке. Единственная гарантия, которую дает язык, заключается в том, что он автоматически выделяет их для вас, когда они входят в область видимости, и автоматически удаляет их для вас, когда они выходят из области видимости.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню