1) Shouldn't i get an error saying stringB is too small to hold stringA ?
you didn't get any error because of compilers memory allocation scheme. there is a good chance that compiler would have allocated memory to stringB first and stringA later. so consider if stringB is having memory location 1000 (only one byte), then stringA will be having memory locations from 1001 to 1020(including space for NULL). so when ever you try to copy contents from stringA to stringB into your function, it actually copies from location 1001 to 1000, then 1002 to 1001 and so on, so according to your program you must be having output as shown if this is the case. it seems that you are printing addresses of strings. see addresses of strings and check if this is the case. again this is merely consequence that string2 is allocated memory first than stringA. it is not neccesary that on all the variations of compilers, this will be the answer everytime.
stringB : To be or not to bee
stringA : o be or not to bee
now you are not getting error because both arrays are present in stack frame and both are accessed by pointers, so compiler doesn't care about sizes of array when data copy is done using pointers. it just copies till you are in allowed memory space. if this is not the case and stringA would have been present first in memory, then you would get segmentation fault.
2) Why is char str[1] = "abcd" illegal then ?
not this is very different case than your case, you are allocating only one byte to string, and initializing it with more characters than its size. note that your data copy is being done at run time, but this initialization is at compile time, so compiler knows size of array and will show you a warning, it is not illegal but compiler only assigns first character to string and you may get unpredictable result as there no space left for NULL character at last.