user2416871
user2416871

Reputation: 543

size of character array and size of character pointer

I have a piece of C code and I don't understand how the sizeof(...) function works:

#include <stdio.h>

int main(){
   const char  firstname[] = "bobby";
   const char* lastname = "eraserhead";
   printf("%lu\n", sizeof(firstname) + sizeof(lastname));
   return 0;
}

In the above code sizeof(firstname) is 6 and sizeof(lastname) is 8.

But bobby is 5 characters wide and eraserhead is 11 wide. I expect 16.

Why is sizeof behaving differently for the character array and pointer to character?

Can any one clarify?

Upvotes: 20

Views: 59939

Answers (6)

MarcH
MarcH

Reputation: 19756

how the sizeof(...) function works

sizeof() looks like a function but it's not a function. A function computes something at run-time.

sizeof() asks the compiler, at compile-time, how much memory it allocates for the argument. BTW sizeof() has no idea how much of it you actually use later at run time. In other words, you've "hardcoded" the printf arguments in your example.

Why is sizeof behaving differently for the character array and pointer to character?

A pointer rarely requires the same amount of memory as an array.

In general, the amount of memory allocated for a pointer is different to what is allocated for its pointee.

Upvotes: 4

Yu Hao
Yu Hao

Reputation: 122383

sizeof an array is the size of the total array, in the case of "bobby", it's 5 characters and one trailing \0 which equals 6.

sizeof a pointer is the size of the pointer, which is normally 4 bytes in 32-bit machine and 8 bytes in 64-bit machine.

Upvotes: 6

user1300630
user1300630

Reputation:

The size of your first array is the size of bobby\0. \0 is the terminator character, so it is 6.

The second size is the size of a pointer, which is 8 byte in your 64bit system. Its size doesn't depends on the assigned string's length.

Upvotes: 4

caf
caf

Reputation: 239041

firstname is an array of 6 chars, including the terminating '\0' character at the end of the string. That's why sizeof firstname is 6.

lastname is a pointer to char, and will have whatever size such a pointer has on your system. Typical values are 4 and 8. The size of lastname will be the same no matter what it is pointing to (or even if it is pointing to nothing at all).

Upvotes: 3

Leigh
Leigh

Reputation: 12506

firstname[] is null-terminated, which adds 1 to the length.

sizeof(lastname) is giving the size of the pointer instead of the actual value.

Upvotes: 2

alk
alk

Reputation: 70931

firstname is a char array carrying a trailing 0-terminator. lastname is a pointer. On a 64bit system pointers are 8 byte wide.

Upvotes: 26

Related Questions