[Задача] Адресная арифметика - C (СИ)
Формулировка задачи:
Просьба к модераторам: НЕ надо перетаскивать в разделы типа "Си\Си++ для экспертов"
Пример возник на основе реальной программы. Пример содержит ошибку, а потому не факт, что повторится на всех компиляторах. В моём случае ошибка проявлялась на i386-linux32 при использовании компилятора gcc.
Запуск без оптимизаций:
Запуск с оптимизациями:
Вопрос. В программе перед printf'ами есть операция "tmp = b;". Почему напечатались разные значения для "tmp" и "b"? Эти значения далеко не рандомные: одно напечатанное значение соответствует "старому" значению переменной "b", а другое - "новому"
#include <stdio.h> char a = 5; char b = 10; int main (void) { char tmp; /* Для контроля убедимся, что "a" и "b" оказались в соседних * ячейках памяти. Разница указателей должна равняться единице. * Именно единицу мы используем в следующем операторе */ printf ("&b - &a = %d\n", &b - &a); /* Записываем в переменную "b" */ *(&a + 1) = 11; /* Читаем из переменной "b" */ tmp = b; printf ("tmp = %d\n", tmp); printf ("b = %d\n", b); return 0; }
$ gcc t.c $ ./a.out &b - &a = 1 tmp = 11 b = 11
$ gcc t.c -O3 $ ./a.out &b - &a = 1 tmp = 10 b = 11
Традиционная просьба прятать догадки и ответы под CUT'ом
Решение задачи: «[Задача] Адресная арифметика»
textual
Листинг программы
extern char b; char* func () { return &b; }
Объяснение кода листинга программы
- Объявление переменной
b
типа char с внешним связыванием (extern). - Определение функции
func
, которая возвращает указатель на переменнуюb
. - Возвращаемое значение функции
func
будет адресом переменнойb
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д