why is the output of the below code the case?
char str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'}; //this code equates to 7 bytes
char* str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'}; //this code equates to 28 bytes
why is the output of the below code the case?
char str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'}; //this code equates to 7 bytes
char* str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'}; //this code equates to 28 bytes
This code does not do what you think. It uses char
constants to initialize elements of a char*
array of pointers. Such "pointers" do not point to your characters; instead, they have numeric values of their corresponding characters!
Each character pointer on your system is 4-bytes long, which explains the result.
Your compiler should be throwing a warning for this
char *str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'};
the type of the actual elements is incompatible with the type of the array elements.
Size of a pointer defaults to the environment address width, because pointers must be made capable of covering theoretically available address space, i.e. pointing at any of the addresses possible within current system architecture. In a 32-bit system it is 32-bit (2^32 possible addresses), in a 64-bit system 64-bit (2^64 possible addresses), no matter if it points at a char
or a double
. Size of an array of pointers equals number_of_array_elements*size_of_pointer
.
#include <stdio.h>
int main (void)
{
char str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'}; //this code equals 7*sizeof(char)
char* str1[] = {"i", "t", "i", "s", "m", "e", "\0"}; //this code equals 7*sizeof(char*)
printf("%zu\t%zu\n", sizeof(str), sizeof(str1));
return 0;
}
This SO post may also be worth reading.