5.1.2.2 Sizeof Operator With Pointer Types

The C sizeof operator when acting on pointer types or on structure or array types that contain a pointer may not work reliably. This operator, however, may be used with pointer, structure, or array identifiers. This is due to the dynamic nature of pointer size used by the compiler.

For the following code:

char * cp;
size_t size;
size = sizeof(char *);
size = sizeof(cp);

size in the first example will be assigned the maximum size a pointer can be for the particular target device you have chosen. In the second example, size will be assigned the actual size of the pointer variable, cp.

The sizeof operator using a pointer variable operand cannot be used as the number-of-elements expression in an array declaration. For example, the size of the following array is unpredictable:

unsigned buffer[sizeof(cp) * 10];