вот такую забавную статейку нашел :)

Тема в разделе "LANGS.C", создана пользователем osox, 1 май 2010.

  1. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    улыбнитесь :)

    http://unixfaq.ru/index.pl?req=qs&id=591
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Суть драмы не уловил, но с for-ом там явная лажа, т.к. sizeof массива вернет размер в байтах, а не в элементах. for в статье будет всегда вылазить за границы массива.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Нормально там, так как p это указатель, а не индекс.
     
  4. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    было бы нормально если бы p был указателем на байт а так он в 4 раза больше памяти чем выделил испортит :)
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    osox
    Да что вы пишите такое? Так проверка с указателем + sizeof. От знатоки Си. ^)
     
  6. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    вот puzzles на си думаю вам понравится :)
    http://www.gowrikumar.com/c/
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    2Booster
    смотрите :)
    int tab[1], *p;
    for (p = tab; p < tab + sizeof(tab)/sizeof(tab[0]); p++)
    {
    *p = 555;
    }
    sizeof(tab) вернет 400 p указатель на int тоесть плюс 1 к нему он уже на 4 сдвигается его можно только сдвинуть на sizeof(tab)/sizeof(tab[0]) тоесть на 100 плюc для каждого размер ссылки 4 и получится 400 байт а так получается 1600 байт затирает вместо 400 :)
     
  8. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    int tab[100], *p;
    имелось ввиду :)
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    osox
    Что-то вы не то пишите. Откуда tab + sizeof(tab)/sizeof(tab[0])?
    По первой ссылке.
    Код (Text):
    1. for (p = tab; p < tab + sizeof(tab); p++) {
    2.     ...
    3. }
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Это вообще бредокод, который х.з как будет работать.
     
  11. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    2Booster
    это я переделал в правильный вариант как должно было быть :)
    ну или так еще можно было бы
    Код (Text):
    1. for (p = tab; p < (char*)tab + sizeof(tab); p++) {
    2.     ...
    3. }
    а вы попробуйте у себя запустить изначальный ваиант сразу получите повреждение стека :)
     
  12. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Booster
    или например в отладчике посмотрите чему равен p после цикла
    вычтите из него базу массива и получите разницу 1600 :)
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    osox
    То что арифметика адресная это понятно, но такое простительно, так как сразу не упомнишь где какой тип. Но в целом конструкция нормальная. В общем понятно чего хотел автор.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Хотя адресная арифметика в for как-то сомнительна. Никогда такое не применял и надеюсь не буду применять.
     
  15. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Booster
    Нет. Ненормальная. Подумай как следует над тем, куда будет указывать tab+sizeof(tab).
    Что такое `+' для указателей? Это когда одно из слагаемых -- указатель, а остальные целые, так? И целые измеряются в _элементах_. То есть tab+1 -- это указатель на первый элемент (на тот, который следует за нулевым). tab+sizeof(tab)/sizeof(tab[0]) -- это указатель на элемент с номером sizeof(tab)/sizeof(tab[0]), то есть на элемент следующий за последним. tab+sizeof(tab) -- это элемент расположенный далеко за границей массива.
    Booster
    Адресная арифметика -- это обоюдоострый инструмент. Не умея им пользоваться можно всё поломать. Но это не значит, что им не надо пользоваться. Надо _уметь_ им пользоваться и применять по делу.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    r90
    Ну не сообразил сразу, что тут адресная арфметика, каюсь. ^) Уж очень редко мне ей приходится пользоваться. Так же наверно и автор написал, неподумав. Объяснять что это такое мне не нужно.
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    r90
    Код (Text):
    1. Адресная арифметика -- это обоюдоострый инструмент. Не умея им пользоваться можно всё поломать. Но это не значит, что им не надо пользоваться. Надо _уметь_ им пользоваться и применять по делу.
    А я что против. В примере явно без дела.
     
  18. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Booster
    Это почти неотъемлимое свойство примеров.
     
  19. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Сегодня компиляторы оптимизируют циклы таким образом, что индексы превращаются в арифметику адресов. Происходит это в RELEASE. Так что обычное (Kernighan & Ritchie) будет работать с тем же успехом (проверено на компиляторах Microsoft):
    Код (Text):
    1. for (int i=0; i < sizeof (tab) / sizeof (tab [0]); i++)
    2. {
    3.     //
    4.     // Далее в цикле использовать индекс
    5.     //
    6.     tab [i].<structure member> = ... ;
    7.     //
    8.     // Любая конструкция [b]tab [i][/b] будет оптимизирована в регистр,
    9.     // так что арифметика адресов не требуется.
    10.     //
    11. }
     
  20. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    AsmGuru62
    просто намного чаще удобней указателем обработать массив :)
    хотя иногда наоборот для указателя применяется нотация индексации массивов :)