If you don't need to modify the string content, you can alternatively allocate a pointer on the stack, and the content of the string literal in the flash:
const char* testchar = "HELLO";
Here the linker does allocate the 6 bytes for "HELLO", and the compiler just uses 2 bytes for the pointer testchar on the stack (if it is necessary at all). So this is more efficient than the
char testchar[] = "HELLO";
syntax, but the string content is not modifiable or owned by the function, so it depends on what you need. I did add an explicit const to make sure the string does not get changed accidentally.
For super long strings, by the way, don't initialize the string on the stack.
Write the value into it:
char testchar[100];
(void)strcpy(testchar, "HELLO");
This runs at lot faster as ANSI requires that otherwise all 100 bytes are initialized. It's a init all or nothing thing.
Daniel