If I declare a char array of say 10 chars like so...
char letters[10];
am I creating a set of memory locations that are represented as chars fr
Seems like you are confused with arrays and strings.
When you declare
char letters[10] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
then it reserves only 10 contiguous bytes in a memory location.
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 //memory addresses. I assumed it is to be starting from 2000 for simplification.
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| | | | | | | | | | |
| '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' |
| | | | | | | | | | |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
In C indexing starts from 0
. You can access your allocated memory location from letters[0]
to letters[9]
. Accessing the location letters[10]
will invoke undefined behavior. But when you declare like this
char *letters = "0123456789";
or
char letters[11] = "0123456789";
then there are 11 bytes of space are allocated in memory; 10 for 0123456789
and one for \0
(NUL character).
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 //memory addresses. I assumed it is to be starting from 2000 for simplification.
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
| | | | | | | | | | | |
| '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '\0' |
| | | | | | | | | | | |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
^
| NUL character
Take another example
#include
int main(){
char arr[11];
scanf("%s", arr);
printf("%s", arr);
return 0;
}
Input:
asdf
Output:
asdf
Now have a look at memory location
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+
| | | | | | | | | | | |
| 'a' | 's' | 'd' | 'f' |'\0' | | | | | | |
| | | | | | | | | | | |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-------+