Почему sizeof (массив) умножается?

Это не имеет смысла для меня:

    int start_tab[2];
    printf("size of an array: %d\n", sizeof(start_tab));
    8

Почему 8? Как сделать так, чтобы он был размером 2?


person krzyhub    schedule 07.04.2015    source источник
comment
Почему бы не прочитать документацию по оператору sizeof?   -  person juanchopanza    schedule 07.04.2015
comment
извините, раньше я программировал на высших языках, и это кажется очевидным, но теперь я слишком зол, чтобы просто читать.   -  person krzyhub    schedule 07.04.2015
comment
возможный дубликат оператора sizeof() в C   -  person Fiddling Bits    schedule 07.04.2015


Ответы (6)


Обратите внимание, sizeof — это оператор, а не функция. sizeof возвращает размер предоставленного типа данных.

Почему 8?

start_tab типа int [2] возвращает 2 * sizeof (int)# или 8.

Как сделать так, чтобы он был размером 2?

Если вы хотите получить количество элементов в массиве, просто разделите общий размер на размер одного элемента, например

sizeof(start_tab) / sizeof(start_tab[0])

# На вашей платформе sizeof(int) == 4.

person Sourav Ghosh    schedule 07.04.2015

Вам нужно разделить на размер типа, как это

sizeof(start_tab) / sizeof(int)

sizeof дает размер в байтах, поскольку каждый int равен 4 байтам, тогда два из них, очевидно, равны восьми, поэтому вы можете разделить на размер int и получить искомое значение.

person Iharob Al Asimi    schedule 07.04.2015

Вы должны сделать sizeof(start_tab)/sizeof(start_tab[0]), чтобы получить количество элементов в массиве

person Mateo Hrastnik    schedule 07.04.2015

Поскольку int составляет 4 байт... так что умножьте на 2, получите 8 Итак, если вы хотите, чтобы размер элемента разделился на sizeof(int).

person rfkortekaas    schedule 07.04.2015

Потому что int на вашей платформе 32-битный, что составляет 4 байта. У вас есть 2 ints, умноженные на 32 бита, равные 64 битам, что составляет 8 байт. sizeof вернет размер типа данных в байтах.

person TobiSH    schedule 07.04.2015

Из стандарта C (6.5.3.4 Операторы sizeof и alignof)

2 Операция sizeof возвращает размер (в байтах) своего операнда, который может быть выражением или именем типа в скобках.

Множество

int start_tab[2];

занимает 2 * sizeof( int ) байт, потому что он состоит из двух элементов, и каждый элемент имеет тип int. Таким образом, если sizeof( int ) равно 4, то массив занимает 8 байт.

Итак, у вас есть формула

sizeof( start_tab ) = 2 * sizeof( int )

Или в общем случае, если массив имеет N элементов типа T, например,

T array[N];

тогда

sizeof( array ) = N * sizeof( T )

Или, поскольку каждый элемент массива имеет тип T, включая первый элемент массива, вы также можете написать

sizeof( array ) = N * sizeof( array[0] )

Используя эту формулу, вы можете рассчитать N как

N = sizeof( array ) / sizeof( array[0] )

or

N = sizeof( array ) / sizeof( *array )

потому что *array дает первый элемент массива.

person Vlad from Moscow    schedule 07.04.2015