1. Си / Говнокод #29109

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    // https://tio.run/##jY9PC4JAFMTv@ymGJHFjDc06WUEdugpd1YPomgu2in8oED@7WVpRh@jdZt7vDfNCPUwDeeo6oggZpnXEsS6rSGTzZEuIEvFYSI6D42g5QxbHJa8oogwNPIJ@8kLIKtYm06snJwxq7uoD5VO7R1pcEpFyzaDvsP3u@F/YjyzSgzgHQmoUzeP2bgSujw0ag8FkWDBYDEuGVWu/iFneA2rgWv7gjY@Z9FPWox6rml/yuS54VRcShk3arrsB
    
    #include <stdio.h>
    
    #define FOO(p, offset) do { \
        printf("%x\n", &p[-offset]); \
    } while(0)
    
    #define BAR(p, offset) do { \
        printf("%x\n", p[-offset]); \
    } while(0)
    
    
    int main() {
        int a[] = {0, 1, 2, 3, 4, 5};
        int *p = &a[3];
        FOO(p, 1);
        FOO(p, 1u);
        BAR(p, 1);
        BAR(p, 1u);
        return 0;
    }

    Запостил: testhuest, 27 Марта 2025

    Комментарии (4) RSS

    • Объясните. в чём прикол?
      Ответить
      • Попробуй sfc /scannow кастить смещение в лонг инт

        Говорят на новых 64-битных платформах sizeof(int) < sixeof(int*), именно поэтому
        Ответить
        • Вообще полагаться на размер инта плохо. Для каста есть всякие size_t и ptrdiff_t. Ну и вдогонку uint32_t, uint64_t, uint128_t etc.
          Ответить
          • Да я понял уже. Стоило привести сферический пример в вакууме, и только после этого осознал в чём проблема.

            У меня есть стек, в котором размер элемента, и куда растёт сам стек настраивается. До какого-то момента всё идеально работало, пока в макросню не попал унсигнед и арифметика перестала работать из-за того что модуль стал больше и я заебался искать, в чём проблема.
            Ответить

    Добавить комментарий