fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. // Объявление переменных
  7. char *p, c = 0;
  8. int *a, b = 0;
  9. float *x, y = 3.5f;
  10. double *m, n = 0.0;
  11.  
  12. // Для безопасной работы с m += 2
  13. double arr[3] = {0.0, 0.0, 0.0};
  14. m = arr; // теперь m указывает на массив из 3 double
  15.  
  16. // === Вывод адресов и размеров ВСЕХ переменных (включая указатели) ===
  17. printf("=== Addresses and sizes ===\n");
  18. printf("p: addr=%p, size=%zu\n", (void*)&p, sizeof(p));
  19. printf("c: addr=%p, size=%zu\n", (void*)&c, sizeof(c));
  20. printf("a: addr=%p, size=%zu\n", (void*)&a, sizeof(a));
  21. printf("b: addr=%p, size=%zu\n", (void*)&b, sizeof(b));
  22. printf("x: addr=%p, size=%zu\n", (void*)&x, sizeof(x));
  23. printf("y: addr=%p, size=%zu\n", (void*)&y, sizeof(y));
  24. printf("m: addr=%p, size=%zu\n", (void*)&m, sizeof(m));
  25. printf("n: addr=%p, size=%zu\n", (void*)&n, sizeof(n));
  26. printf("arr:addr=%p, size=%zu (total array)\n", (void*)arr, sizeof(arr));
  27. printf("\n");
  28.  
  29. a = &b;
  30. printf(" Enter b = ");
  31. // === ТОЧКА ОСТАНОВА: для отладчика поставьте breakpoint здесь ===
  32. // В коде — просто комментарий, или используйте getchar() в DEBUG-режиме
  33. // getchar(); // раскомментируйте, если нужна пауза
  34.  
  35. // Исправлено: scanf, а не scan
  36. if (scanf("%d", a) != 1) {
  37. fprintf(stderr, "Input error!\n");
  38. return 1;
  39. }
  40.  
  41. printf("a=%p\t*a=%d\tb=%d\n", (void*)a, *a, b);
  42.  
  43. // Исправлено: явное приведение int* → char*
  44. p = (char*)a;
  45. c = *p;
  46. *p = *(p + 3);
  47. *(p + 3) = c;
  48. printf("p=%p\tc=%d\ta=%p\tb=%d\n", (void*)p, (int)c, (void*)a, b);
  49.  
  50. x = &y;
  51. printf("x=%p\t*x=%f\ty=%f\n", (void*)x, *x, y);
  52.  
  53. // Исправлено: явное приведение float* → int* (предупреждение уйдёт, но strict aliasing violation остаётся — в учебных целях допустимо)
  54. a = (int*)x;
  55. *a = (int)(*x); // преобразуем значение, а не читаем как int напрямую (менее опасно)
  56. // Альтернатива (более корректно): *a = (int)(*x);
  57. printf("a=%p\t*a=%d\tx=%p\t*x=%f\ty=%f\n", (void*)a, *a, (void*)x, *x, y);
  58.  
  59. a = &b;
  60. y = 12345.6789f; // исправлено: точка, а не запятая; суффикс f для float
  61. printf("x=%p\t*x=%f\ty=%f\n", (void*)x, *x, y);
  62.  
  63. p = (char*)x; // явное приведение
  64. c = *p;
  65. *p = *(p + 3);
  66. *(p + 3) = c;
  67. printf("p=%p\tc=%d\tx=%p\ty=%f\n", (void*)p, (int)c, (void*)x, y);
  68.  
  69. // Теперь m указывает на arr[0]
  70. printf("m=%p\t*m=%f\tn=%f (note: n is separate, not used here)\n", (void*)m, *m, n);
  71. // Но по смыслу, вероятно, хотели m = &n — однако тогда m += 2 опасно.
  72. // Оставим m → arr, а отдельно выведем n
  73.  
  74. n = 5.5;
  75. printf("n (direct) = %f\n", n);
  76. // Выводим состояние arr[0], где сейчас m указывает
  77. printf("m->arr[0]=%f\n", *m);
  78.  
  79. b = (int)1.7; // n = y = 1.7 → но b — int, поэтому присваиваем явно
  80. y = 1.7f;
  81. n = 1.7;
  82. printf("b=%d\ty=%f\tn=%f\n", b, y, n);
  83.  
  84. printf("*a=%d\t*x=%f\t*m=%f\n", *a, *x, *m);
  85.  
  86. m += 2; // теперь указывает на arr[2] — безопасно, т.к. arr[3]
  87. printf("n=%f\tn_addr=%p\tm=%p\n", n, (void*)&n, (void*)m);
  88.  
  89. // Теперь *m — это arr[2], безопасно
  90. *m = (double)((float)(*a) - n + (double)((int)(*x)));
  91. printf("m=%p\t*m=%f\n", (void*)m, *m);
  92.  
  93. // === Вывод значений всех переменных в конце ===
  94. printf("\n=== Final values ===\n");
  95. printf("p = %p\n", (void*)p);
  96. printf("c = %d ('%c')\n", (int)c, (c >= 32 && c <= 126) ? c : '?');
  97. printf("a = %p\n", (void*)a);
  98. printf("b = %d\n", b);
  99. printf("x = %p\n", (void*)x);
  100. printf("y = %f\n", y);
  101. printf("m = %p\n", (void*)m);
  102. printf("n = %f\n", n);
  103. printf("arr[0] = %f, arr[1] = %f, arr[2] = %f\n", arr[0], arr[1], arr[2]);
  104.  
  105. return 0; // исправлено: return 0;
  106. }
Success #stdin #stdout 0s 5316KB
stdin
5
stdout
=== Addresses and sizes ===
p:  addr=0x7ffff7ac3008, size=8
c:  addr=0x7ffff7ac2fff, size=1
a:  addr=0x7ffff7ac3010, size=8
b:  addr=0x7ffff7ac3000, size=4
x:  addr=0x7ffff7ac3018, size=8
y:  addr=0x7ffff7ac3004, size=4
m:  addr=0x7ffff7ac3020, size=8
n:  addr=0x7ffff7ac3028, size=8
arr:addr=0x7ffff7ac3030, size=24 (total array)

  Enter b = a=0x7ffff7ac3000	*a=5	b=5
p=0x7ffff7ac3000	c=5	a=0x7ffff7ac3000	b=83886080
x=0x7ffff7ac3004	*x=3.500000	y=3.500000
a=0x7ffff7ac3004	*a=3	x=0x7ffff7ac3004	*x=0.000000	y=3.500000
x=0x7ffff7ac3004	*x=12345.678711	y=12345.678711
p=0x7ffff7ac3004	c=-73	x=0x7ffff7ac3004	y=-0.000011
m=0x7ffff7ac3030	*m=0.000000	n=0.000000 (note: n is separate, not used here)
n (direct) = 5.500000
m->arr[0]=0.000000
b=1	y=1.700000	n=1.700000
*a=1	*x=1.700000	*m=0.000000
n=1.700000	n_addr=0x7ffff7ac3028	m=0x7ffff7ac3040
m=0x7ffff7ac3040	*m=0.300000

=== Final values ===
p = 0x7ffff7ac3004
c = -73 ('?')
a = 0x7ffff7ac3000
b = 1
x = 0x7ffff7ac3004
y = 1.700000
m = 0x7ffff7ac3040
n = 1.700000
arr[0] = 0.000000, arr[1] = 0.000000, arr[2] = 0.300000