Переменный адрес меняется, погода, мы диплай это или нет? - PullRequest
0 голосов
/ 22 апреля 2020

Может кто-нибудь объяснить это?

Рассмотрим эту программу. Мы намеренно пишем модифицировать dest[10], чтобы увидеть изменение j.

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char source[] = "Hello";
    int j = 100;
    char dest[10];
    dest[12] = 'A';
    printf("j   = %d \n", j);
    fflush(stdout);
    printf("j   = %d \n", j);
    fflush(stdout);
    printf("*j   = %p \n", &j);   // comment this line to get another result!
    return 0;
}

вывод:

j   = 4259940
j   = 4259940
*j   = 0x7ffcc4cdef74

Но если мы прокомментируем строку, отображающую j адрес переменной printf("*j = %p \n", &j);, мы получим:

j   = 100
j   = 100

Это похоже на j хранится в другом месте, а не только после переменной dest, как в первом примере.

Любое объяснение?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Где и нужно ли хранить объекты j и dest и как обрабатывать доступ за пределами границ в dest[10] - выбор компилятора. Современные компиляторы делают много сложных вещей для оптимизации программ. Когда вы опускаете оператор, который печатает адрес j, компилятор делает разные варианты, и они дают разные результаты.

1 голос
/ 22 апреля 2020

Переменная не обязана иметь какой-либо адрес хранения, если адрес не взят. Компилятор может хранить значение только в регистре или полностью удалять его с помощью механизмов оптимизации и напрямую использовать только постоянное значение 100.

Вы можете проверить, не испортили ли вы значение dest вместо j не хранится в стеке.

...