Sizeof c что это
Перейти к содержимому

Sizeof c что это

  • автор:

Оператор sizeof (C)

Оператор sizeof предоставляет объем хранения (в байтах), необходимого для хранения объекта типа «операнд». Этот оператор позволяет избежать задания зависимых от компьютера размера данных в программах.

Синтаксис

sizeof unary-expression sizeof ( type-name ) 

Примечания

Операнд является либо любым идентификатором unary-expression, либо выражением type-cas (то есть описателем типа, заключенным в скобки). unary-expression не может представлять объект битового поля, неполный тип или указатель функции. Результатом является целочисленная константа без знака. Стандартный заголовок STDDEF.H определяет этот тип как size_t.

При применении оператора sizeof к идентификатору массива результатом является размер целого массива, а не размер указателя, представленного идентификатором массива.

При применении оператора sizeof к имени структуры или типа объединения, идентификатору структуры или типа объединения, результатом является число байтов в структуре или объединении, включая внутреннее и конечное заполнение. Этот размер может включать внутреннее и конечное заполнение, используемое для выравнивания элементов структуры или объединения относительно границ памяти. Таким образом, результат может не соответствовать размеру, вычисленному путем добавления требований к хранению отдельных элементов.

Если безразмерный массив является последним элементом структуры, оператор sizeof возвращает размер структуры без массива.

buffer = calloc(100, sizeof (int) ); 

В этом примере для передачи размера объекта sizeof , который меняется в зависимости от компьютеров, как аргумент функции времени выполнения с именем int , используется оператор calloc . Значение, возвращаемое функцией, хранится в buffer .

static char *strings[] = < "this is string one", "this is string two", "this is string three", >; const int string_no = ( sizeof strings ) / ( sizeof strings[0] ); 

В этом примере strings — это массив указателей на char . Число указателей — это число элементов в массиве, но оно не определено. Легко определить количество указателей с помощью оператора sizeof , вычислив число элементов в массиве. Значение целого числа const string_no инициализируется до этого числа. Поскольку это значение const , string_no невозможно изменить.

Оператор sizeof

sizeof — это унарный оператор, возвращающий длину в байтах переменной или типа, помещенных в скобки. Например:

float f;
printf(«%f «, sizeof f);
printf(«%d», sizeof(int));

выдает 4 2. (Предполагается использование 16-битных целых.)

Помните, что для вычисления размера типа следует поместить имя типа в круглые скобки. В этом нет необходимости для имен переменных.

Использование sizeof помогает создавать переносимый код для тех случаев, когда код зависит от размера стандартных типов данных С. Например, представим, что программе, работающей с базой данных, необходимо сохранять 6 целочисленных значений в записи. Для того, чтобы сделать эту программу переносимой, не следует предполагать, что размер целочисленного типа — 2 или 4 байта, следует самостоятельно определить настоящую длину, используя sizeof. Следующая подпрограмма может быть использована для сохранения записи в файле:

/* Запись записи в файл */

void put_rec(FILE *fp, int rec[6])
int size, num;
size = sizeof(int) * 6;
num = fwrite(rec, size, 1, fp) ;
if(num!=1) printf(«ошибка записи»);
>

Самое главное в этом примере то, что put_rec() будет компилироваться и корректно запускаться на любом компьютере, включая компьютеры, использующие 2- и 4-байтные целые.

Оператор sizeof

Возвращает размер операнда относительно размера типа char .

Дополнительные сведения об операторе см. в разделе «Многоточие sizeof . » и «Шаблоны вариативных».

Синтаксис

sizeof unary-expression sizeof ( type-name ) 

Замечания

Результатом sizeof оператора является тип size_t , целочисленный тип, определенный в файле include stddef.h><. Этот оператор позволяет избежать задания зависимых от компьютера размера данных в программах.

Операнд, который sizeof может быть одним из следующих элементов:

  • Имя типа. Чтобы использовать sizeof имя типа, имя должно быть заключено в скобки.
  • Выражение . При использовании с выражением sizeof можно указать скобки или без нее. Значение выражения не вычисляется.

sizeof Когда оператор применяется к объекту типа char , он возвращает значение 1. sizeof Если оператор применяется к массиву, он выдает общее количество байтов в этом массиве, а не размер указателя, представленного идентификатором массива. Чтобы получить размер указателя, представленного идентификатором массива, передайте его в качестве параметра в функцию, которая использует sizeof . Например:

Пример

#include using namespace std; size_t getPtrSize( char *ptr ) < return sizeof( ptr ); >int main()

Образец вывода

The size of a char is: 1 The length of Hello, world! is: 14 The size of the pointer is 4 

sizeof Если оператор применяется к class типу или struct union типу, результатом является число байтов в объекте этого типа, а также любое заполнение, добавленное для выравнивания элементов по границам слова. Результат не обязательно должен соответствовать размеру, вычисляемому путем добавления требований к хранению отдельных членов. Параметр компилятора /Zp и pragma пакета влияют на границы выравнивания элементов.

Оператор sizeof никогда не дает 0, даже для пустого класса.

Оператор sizeof нельзя использовать со следующими операндами:

  • Функции. (Однако sizeof можно применить к указателям на функции.)
  • Битовые поля.
  • Неопределенные классы.
  • Тип void .
  • Динамически создаваемые массивы.
  • Внешние массивы.
  • Неполные типы.
  • Заключенные в скобки имена неполных типов.

sizeof Если оператор применяется к ссылке, результат такой же, как если бы sizeof он был применен к самому объекту.

Если безразмерный массив является последним элементом структуры, оператор sizeof возвращает размер структуры без массива.

Оператор sizeof часто используется для вычисления количества элементов в массиве с помощью выражения формы:

sizeof array / sizeof array[0] 

Урок 4.Массивы и оператор sizeof

Всем привет! Как и обещал, пищу о массивах и о операторе sizeof. Начнем с массивов. В третьем уроке мы рассмотрели один вариант массива, а сегодня рассмотрим и второй. Массив — это совокупность данных одного типа. То есть вы объявляете множество переменных одного типа. Рассмотрим это на примере.

#include int main ()< int a[3][2]=,,>; double b[5][6]; printf ("a=%d\n", a[0][0]); b[4][5]=10; /*Присваиваем значение 10 массиву b[4][5]*/ printf ("b=%f\n", b[4][5]); return 0; >

Начнем с четвертой строки. Там мы объявляем переменную типа int. Но как вы могли заметить она имеет не обычную конструкцию. Это и есть Массив. После объявления массива у нас идут две квадратные скобки. Это называется ключом. В первой мы указываем количество скобок которые идут после знака равно, а во втором количество значений в каждой скобке. Как видно, у нас в первых квадратных скобках значение 3, и соответственно после знака равно идет одна «большая» скобка, внутри которого содержится три более «маленьких» скобок. Во второй квадратной скобке у нас цифра два, соответственно в «маленьких» скобках по два значения. Обратите внимание, скобки и значения в них разделены запятыми.

В пятой строке у нас опять массив. Но на этот раз мы не присваиваем значения. Это мы можем сделать позднее, например у нас в седьмой строке.

В шестой и восьмой строке мы выводим информацию на экран. Повторяю еще раз, нумерация при выводе и вводе (ввод рассмотрим в следующем уроке) начинается с нуля.

sizeof
Оператор sizeof используется для вывода количества памяти в байтах, которая выделяется для хранения информации. В зависимости от разрядности операционной системы выделяется разное количество памяти. Вот пример использования оператора sizeof.

#include int main (void)

Результат выполнения программы на 64-битной платформе:

b=4 int=4 char=1 short=2 double=8 long=8

Цифры это количество памяти в байтах, выделенных для данного типа переменных. На 16-ти и 32-х битных платформах результат будет другим.

Д/З:

Сколько переменных f остались свободными во втором примере и почему?

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *