fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. char *p, c;
  7. int *a, b;
  8. float *x, y = 3.5f;
  9. double *m, n;
  10.  
  11. // --- Вывод адресов и размеров (по условию) ---
  12. printf("p: %p (%zu)\n", (void*)&p, sizeof(p));
  13. printf("c: %p (%zu)\n", (void*)&c, sizeof(c));
  14. printf("a: %p (%zu)\n", (void*)&a, sizeof(a));
  15. printf("b: %p (%zu)\n", (void*)&b, sizeof(b));
  16. printf("x: %p (%zu)\n", (void*)&x, sizeof(x));
  17. printf("y: %p (%zu)\n", (void*)&y, sizeof(y));
  18. printf("m: %p (%zu)\n", (void*)&m, sizeof(m));
  19. printf("n: %p (%zu)\n", (void*)&n, sizeof(n));
  20.  
  21. a = &b;
  22. printf(" Enter b = ");
  23. // === ТОЧКА ОСТАНОВА ===
  24. scanf("%d", a); // ✅ исправлено scan → scanf
  25. printf("a=%p\t*a=%d\tb=%d\n", (void*)a, *a, b);
  26. p = (char*)a; // ✅ добавлен cast для подавления warning
  27. c = *p;
  28. *p = *(p+3);
  29. *(p+3) = c;
  30. printf("p=%p\tc=%d\ta=%p\tb=%d\n", (void*)p, c, (void*)a, b);
  31. x = &y;
  32. printf("x=%p\t*x=%f\ty=%f\n", (void*)x, *x, y);
  33. a = (int*)x; // ✅ cast
  34. *a = *(int*)x; // ⚠️ strict aliasing violation остаётся, но компилируется
  35. printf("a=%p\t*a=%d\tx=%p\t*x=%f\ty=%f\n", (void*)a, *a, (void*)x, *x, y); // ✅ pintf → printf
  36. a = &b;
  37. y = 12345.6789f; // ✅ запятая → точка + f
  38. printf("x=%p\t*x=%f\ty=%f\n", (void*)x, *x, y);
  39. p = (char*)x; // ✅ cast
  40. c = *p;
  41. *p = *(p+3);
  42. *(p+3) = c;
  43. printf("p=%p\tc=%d\tx=%p\ty=%f\n", (void*)p, c, (void*)x, y);
  44. m = &n;
  45. printf("m=%p\t*m=%lf\tn=%lf\n", (void*)m, *m, n);
  46. n = 5.5;
  47. printf("m=%p\t*m=%lf\tn=%lf\n", (void*)m, *m, n);
  48. b = (int)1.7; y = 1.7f; n = 1.7;
  49. printf("b=%d\ty=%f\tn=%lf\n", b, y, n); // ✅ print → printf
  50. printf("*a=%d\t*x=%f\t*m=%lf\n", *a, *x, *m);
  51. m += 2; // ⚠️ всё ещё UB — выход за границы
  52. printf("n=%lf\tn=%p\tm=%p\n", n, (void*)&n, (void*)m);
  53. *m = (float)*a - n + (int)*x; // ⚠️ запись в произвольную память
  54. printf("m=%p\t*m=%lf\n", (void*)m, *m);
  55.  
  56. // --- Вывод значений (по условию) ---
  57. printf("Final: p=%p c=%d a=%p b=%d x=%p y=%f m=%p n=%f\n",
  58. (void*)p, c, (void*)a, b, (void*)x, y, (void*)m, n);
  59.  
  60. return 0; // ✅ return0 → return 0;
  61. }
Success #stdin #stdout 0.01s 5288KB
stdin
5
stdout
p: 0x7ffc4d48ec10 (8)
c: 0x7ffc4d48ec07 (1)
a: 0x7ffc4d48ec18 (8)
b: 0x7ffc4d48ec08 (4)
x: 0x7ffc4d48ec20 (8)
y: 0x7ffc4d48ec0c (4)
m: 0x7ffc4d48ec28 (8)
n: 0x7ffc4d48ec30 (8)
  Enter b = a=0x7ffc4d48ec08	*a=5	b=5
p=0x7ffc4d48ec08	c=5	a=0x7ffc4d48ec08	b=83886080
x=0x7ffc4d48ec0c	*x=3.500000	y=3.500000
a=0x7ffc4d48ec0c	*a=1080033280	x=0x7ffc4d48ec0c	*x=3.500000	y=3.500000
x=0x7ffc4d48ec0c	*x=12345.678711	y=12345.678711
p=0x7ffc4d48ec0c	c=-73	x=0x7ffc4d48ec0c	y=-0.000011
m=0x7ffc4d48ec30	*m=0.000000	n=0.000000
m=0x7ffc4d48ec30	*m=5.500000	n=5.500000
b=1	y=1.700000	n=1.700000
*a=1	*x=1.700000	*m=1.700000
n=1.700000	n=0x7ffc4d48ec30	m=0x7ffc4d48ec40
m=0x7ffc4d48ec40	*m=0.300000
Final: p=0x7ffc4d48ec0c c=-73 a=0x7ffc4d48ec08 b=1 x=0x7ffc4d48ec0c y=1.700000 m=0x7ffc4d48ec40 n=1.700000