What exactly happens, in terms of memory, when i declare something like:
char arr[4];
How many bytes are reserved for arr?
How is null string accommodated when I ‘strcpy’ a string of length 4 in arr?
I was writing a socket program, and when I tried to suffix NULL at arr[4] (i.e. the 5th memory location), I ended up replacing the values of some other variables of the program (overflow) and got into a big time mess.
Any descriptions of how compilers (gcc is what I used) manage memory?
sizeof(arr)bytes are saved* (plus any padding the compiler wants to put around it, though that isn’t for the array per se). On an implementation with a stack, this just means moving the stack pointersizeof(arr)bytes down. (That’s where the storage comes from. This is also why automatic allocation is fast.)'\0'isn’t accommodated. If you copy “abcd” into it, you get a buffer overrun, because that takes up 5 bytes total, but you only have 4. You enter undefined behavior land, and anything could happen.In practice you’ll corrupt the stack and crash sooner or later, or experience what you did and overwrite nearby variables (because they too are allocated just like the array was.) But nobody can say for certain what happens, because it’s undefined.
* Which is
sizeof(char) * 4.sizeof(char)is always 1, so 4 bytes.