6.5.3.4 The sizeof operator

Constraints

1

The sizeof operator shall not be applied to an expression that has function type or an incomplete type, to the parenthesized name of such a type, or to an expression that designates a bit-field member.

Semantics

2

The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.

3

When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1. When applied to an operand that has array type, the result is the total number of bytes in the array.[1] When applied to an operand that has structure or union type, the result is the total number of bytes in such an object, including internal and trailing padding.

4

The value of the result is implementation-defined, and its type (an unsigned integer type) is size_t, defined in <stddef.h> (and other headers).

5

EXAMPLE 1 A principal use of the sizeof operator is in communication with routines such as storage allocators and I/O systems. A storage-allocation function might accept a size (in bytes) of an object to allocate and return a pointer to void. For example:

extern void *alloc(size_t);
double *dp = alloc(sizeof *dp);

The implementation of the alloc function should ensure that its return value is aligned suitably for conversion to a pointer to double.

6

EXAMPLE 2 Another use of the sizeof operator is to compute the number of elements in an array:

sizeof array / sizeof array[0]

7

EXAMPLE 3 In this example, the size of a variable length array is computed and returned from a function:

#include <stddef.h>
size_t fsize3(int n)
{
      char b[n+3];                  // variable length array
      return sizeof b;              // execution time sizeof
}
int main()
{
      size_t size;
      size = fsize3(10); // fsize3 returns 13
      return 0;
}

Forward References

Footnotes