массивы в сях

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Дикс, 24 Dec 2006.

  1. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    sizeof размер места, занимаемый переменной в памяти. У тебя А имеет тип массива int из 4 элементов. Обычно под разрядностью инт понимается разрядность регистра общего назначения процессора системы. В 32битных компиляторах тип int занимает 32 бита или 4 байта, а у тебя элемента 4. 4*4 = 16. Сошлось!
     
  2. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    хоть я это и сам понял, всё равно пасиба
    осталось узнать функцию, считающую кол-во элементов
     
  3. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    sizeof(A)/sizeof(int)
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    имхо 1 выведет, так как 4/4(у большинства так) = 1 :)
    Но не проверял, не знаю =)

    С или C++?
    На C - никак.
    На C++ - можно, но если массивы типа CArray, vector или подобные. Просто посмотри список их методов.
     
  5. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    int A[10];

    Узнать число элементов - sizeof(A)/sizeof(*A).
    Отдаст 10

    nerezus, неа ;) все далеко не так
     
  6. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    =P Nerezus
     
    1 person likes this.
  7. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    В качестве подтверждения своих слов напиши-ка ф-ию, определяющую кол-во элементов ;)
     
  8. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    как всегда, мы говорили о разных вещах.

    Code:
    int func(int a[])
    {
         return sizeof(a);
    }
    
    int main()
    {
         int rrr[10];
         printf("%d\n", func(rrr));
         return 0;
    }
    Вывод - 4.
    Вполне очевидно, потому что
    int func(int a[])
    нихрена это не массив. В функцию передается указатель на него и это полностью аналогично этому:
    int func(int *a)



    Code:
    	int rrr[10];
    	printf("%d\n", sizeof(rrr)); 
    
    Вывод - 40.
    Тоже очевидно. 10 элементов по 4 байта.
     
  9. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Про что я и говорил.

    Любой sizeof(), как ты сказал, определяется на этапе компиляции.
    Вывод: sizeof() не подходит.
    Т.к. с такой же легкостью мы можем подставить туда числовое значение.

    Ну так вот, на сишнике я не вижу способа определить размер массива.
     
  10. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Динамечски - конечно нельзя.
    никто и не спорит)
     
  11. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    ммм, извините ламера, но разве в этом случае sizeof(A[])/4 - не будет являться кол-вом элементов int-массива? :)
     
  12. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Дикс
    1) при передаче в ф-ию передается не массив, а лишь указатель на его первый элемент.
    2) если это не в ф-ии, то смысла нет, т.к. мы можем просто тупо набрать число с клавы.

    Тем более, int != 4, хотя это верно для большинства машин(но не для всех)
     
    1 person likes this.
  13. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    насколько я помню, указатель - 4 байта, делить на четыре будет всегда еденица.

    Для всех 32-битных.
    Для 64-битных хз, логично предположить, что 64 бита, потому что и в 32- и в 16-битных процах размер инта был равен размеру машинного слова.
     
    #33 _Great_, 6 Jan 2007
    Last edited: 6 Jan 2007
  14. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Нет, не 4 байта, а int.
     
  15. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    При чем тут инт )
     
  16. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Никогда не задумывался, отчего в том же турбопаскале нелязя было юзать больше 64кб памяти без применения спец-фишек? )
    А в 32битных системах больше 4 гигов?
     
  17. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    а при чем тут инт )
    ну совпадает оно с размером адреса нуичо)
     
  18. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    А то, что ты сказал, что при делении на 4 будет всегда 1.
    А это неверно, т.к. указатель нихрена не 4, просто он 4 на большинстве машин!
     
  19. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Ну блин, есесно что не везде :) лол.
    Я же не говорил, что на intel 8088 он тоже 4 байта )
     
  20. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    На большинстве современных машин - 8.