[Задача] Адресная арифметика - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Просьба к модераторам: НЕ надо перетаскивать в разделы типа "Си\Си++ для экспертов" Пример возник на основе реальной программы. Пример содержит ошибку, а потому не факт, что повторится на всех компиляторах. В моём случае ошибка проявлялась на i386-linux32 при использовании компилятора gcc.
#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
Вопрос. В программе перед printf'ами есть операция "tmp = b;". Почему напечатались разные значения для "tmp" и "b"? Эти значения далеко не рандомные: одно напечатанное значение соответствует "старому" значению переменной "b", а другое - "новому"
Традиционная просьба прятать догадки и ответы под CUT'ом

Решение задачи: «[Задача] Адресная арифметика»

textual
Листинг программы
extern char b;
char* func () { return &b; }

Объяснение кода листинга программы

  1. Объявление переменной b типа char с внешним связыванием (extern).
  2. Определение функции func, которая возвращает указатель на переменную b.
  3. Возвращаемое значение функции func будет адресом переменной b.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.5 из 5