简体   繁体   中英

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?

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

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.

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.

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).

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.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM