2016-08-02 1 views
27

Я нашел некоторый код, который получает размер структуры, как это:Что означает struct_type [1]?

sizeof(struct struct_type[1]); 

я тестировал, и он делает вернуть размер struct_type.

И

sizeof(struct struct_type[2]); 

возвращается в два раза размер структуры.

Edit:

struct_type это структура, а не массив:

struct struct_type { 
    int a; 
    int b; 
}; 

Что struct_type[1] на самом деле означает?

+0

'struct_type' - это, вероятно, массив структур,' sizeof (struct struct_type [1]); 'получает размер первого элемента в массиве структур. – Caw

+1

@iwin нет, это не аранжировка, любезно посмотрите мое обновление – Nik

+7

Как вы объявляете массив 'struct_type'? Теперь подумайте, как получить размер этого массива по типу. Обычно это не очень хорошая практика, так как лучше взять объект 'sizeof', т. Е. Переменную или разыменовать указатель на тип. Таким образом, ваш код не сломается, если вы измените тип объекта. Другая проблема заключается в использовании целочисленной константы в коде (ака «магическое число»). Плохая практика, используйте '# define' (aka macro). – Olaf

ответ

23

Запомнить sizeof синтаксис:

sizeof (typename); 

Здесь Ьурепате является struct struct_type[N] или более читаемом виде struct struct_type [N] который представляет собой массив из N объектов типа структуры struct_type. Как вы знаете, размер массива - это размер одного элемента, умноженный на общее количество элементов.

13

Так же, как:

sizeof(int[1]); // will return the size of 1 int 

и

sizeof(int[2]); // will return the size of 2 ints 

Так же:

sizeof(struct struct_type[1]); // return size of 1 `struct struct_type' 

и

sizeof(struct struct_type[2]); // return size of 2 `struct struct_type' 

Здесь struct struct_type[1] и struct struct_type[2] просто представляют arrays элементов типа struct struct_type и sizeof. Это просто возвращает размер представленных массивов.

+0

Нет, не будет. Он даже не компилируется. У вас не может быть объявления в 'sizeof' – Olaf

+0

. @Olaf исправил его. – sps

+0

Не только это, но и то, и другое вернет размер int *. – Doddy

7

Для декларации

int arr[10]; 

размер массива может быть вычислена с помощью либо с помощью arr в качестве операнда или int [10]. Так как оператор sizeof дает размер в зависимости от типа операнда, то оба sizeof(arr) и sizeof (int [10]) возвращают размер массива arr (в конечном счете arr имеет тип int [10]).

С11-§6.5.3.3/2:

Оператор SizeOf дает размер (в байтах) свой операнд, который может представлять собой выражения в скобках или имя типа. Размер определяется по типу операнда. Результат - целое число. Если тип операнда - тип массива переменной длины, то операнд оценивается; в противном случае операнд не оценивается, а результат является целочисленной константой.

Аналогично, для массива struct struct_type

struct struct_type a[1]; 

размера можно рассчитать либо по sizeof (a) или sizeof(struct struct_type[1]).

Смежные вопросы