Поведение компилятора для целочисленных указателей на необъявленную память

0

Каково значение q после выполнения следующего кода? m 'сохраняется в памяти, начиная с байта 2 и без проблем с памятью.

int m = 44;
int* p = &m;
int n = (*p)++;
int* q = p - 1;
++*q;

Когда я выполняю этот код на gcc, код инициализирует память, на которую указывает q, до 1606417464, а затем последняя строка меняет ее на 1606417465. Это имеет смысл для меня, поскольку этому блоку памяти не присвоено значение.

Когда я выполняю этот код на своем mac с помощью xtools, память, на которую указывает q, инициализируется как ноль, а затем изменяется на 1 после ++ * q. Любая идея, почему такое поведение происходит?

Теги:
pointers
macos
gcc

1 ответ

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

Ваш код вызывает неопределенное поведение при попытке изменить *q (как в ++*q).

int m = 44; // Let say &m is 1000.
int* p = &m; //  p is 1000 now.
int n = (*p)++; // assigns 45 to 'n'.
                // Now *p (which is 'm') becomes 45.
                // Note p is not modified here but only *p is modified.
int* q = p - 1; // q is 996 or 1004 (depending on which side stack grows)
                //  and assumes sizeof(int*) == 4
                // which may or may not a valid address and may not belong
                // to your program.
++*q; // Here you are essentially modifying some random memory.

Ещё вопросы

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