One other difference on modern compilers relating specifically to character arrays:
This will work fine:
char arr[] = "stuff";
printf("arr:%s\n", arr);
arr[0] = 'b'; arr[1] = 'l';
printf("arr:%s\n", arr);
arr is allocated on the stack (not heap, sorry about the mistake) and is mutable.But the following will segfault:
char* ptr = "stuff";
printf("ptr:%s\n", ptr);
ptr[0] = 'b'; ptr[1] = '1';
printf("ptr:%s\n", ptr);
Strings are allocated in the read-only data segment. Technically you can only write const char* ptr = "stuff", but due to wanting to remain backward compatibile, gcc will let you write the above and not even warn you unless you use -Wall or similar.