Home > Software engineering >  is sizeof a pointer equal to sizeof a pointer to pointers?
is sizeof a pointer equal to sizeof a pointer to pointers?

Time:10-28

when I got an array of pointers and a pointer why sizeof the array of poninters is equal to the sizeof pointer? for example:

char matrixp;
char **m;
printf("%llu", sizeof matrixp);
printf("%llu", sizeof m);

gives back the same output. is there a way I can get the total size in bytes for example of

char *vet[10]

? (that should be 80).

CodePudding user response:

To answer the question in the title - pointers to different types (including pointer types) do not all have to be the same size. The only requirements are:

  • char * and void * have the same size and alignment;
  • Pointers to qualified types have the same size and alignment as pointers to their unqualified equivalents (e.g., sizeof (int *) == sizeof (const int *);
  • All struct pointer types have the same size and alignment;
  • All union pointer types have the same size and alignment;

So it's not guaranteed that an int * is the same size as an int ** or an int (*)[N], but for commodity hardware like x86_64 it tends to be true.

Now, for your specific questions:

First of all, a sizeof expression has type size_t, for which we need to use the %zu conversion specifier in printf. Using %llu on a size_t argument is technically undefined behavior. Rewrite those statements as

printf("%zu", sizeof matrixp);   
printf("%zu", sizeof m);

and see if you still get the same output. You shouldn't because you've defined matrixp as a plain char (at least in the code you've posted here), and sizeof (char) is 1 by definition, and I will guarantee no pointer type is only one byte wide (unless you're working on a system that only has 256 addressable memory locations).

Secondly, sizeof evaluates to the number of bytes in the operand (whether the operand is a type name or expression). sizeof vet will yield the total number of bytes used by the vet array (10 * sizeof (char *)). To get the number of elements (10), you'll have to divide the result of sizeof vet by the size of an individual element, sizeof vet[0] (or sizeof *vet, which evaluates to the same thing).

CodePudding user response:

All pointer have the same size (8 bytes). If you want to get the total size of an array (like char *vet[10]), you have to declare it as an array (with []) and not as a pointer (char **vert). *vert[10] is an array of 10 pointers while **vert is a pointer to the start of an area of memory containing pointers.

For example

#include <stdio.h>

int main(void){
    char *chars[] = {"hello", "world", "pointers"}; // declared as an array of strings/pointers
    printf("%zu\n", sizeof(chars[0])); // pointer to the start of 'hello' (size is 8)
    printf("%zu\n", sizeof(chars[1])); //pointer to start of 'world' (still 8 bytes)
    printf("%zu\n", sizeof(chars)); // refers to the whole array (24 bytes)

    char **m; // a pointer pointing to the first pointer in m (not an array)
    char *n; // another pointer pointing to the first letter in n
    n = "pointer";
    printf("%zu\n", sizeof(n)); // 8
    printf("%zu\n", sizeof(m)); // 8

    return 0;
}
  • Related