Reputation: 543
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
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
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
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
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
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
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