store and retrieve array of chars in flash memory

We can not follow you. Can you forget about it and start all over ?
The problem in your sketch was a bug, but the bug is not the problem. The way you want to solve a problem is not okay.

You can put char arrays and tables with pointers in flash memory. That is normal.

The Serial.println() functions can take a text from ram and also a text from flash. For example Serial.println( F( "Hello")) puts the "Hello" in PROGMEM memory.

The many strcat_P() functions accept a pointer from PROGMEM memory. A text in PROGMEM can be used but also the "P()" macro can be used.
There is even een sprintf_P() function, that puts the format string in flash.

When writing a sketch, you have to glue everything together. It depends on your goal how to do that. When you need a text in RAM to be able to alter it, then you need a RAM buffer. When you only use the Serial.println() functions, then a pointer to PROGMEM can be used and it will be solved inside the Serial.println() functions.

When copying a text from PROGMEM byte-by-byte, the text can be altered on the fly. That is also a normal way to change a text without the need to use a buffer.

I do often use a buffer. For example for libraries that do not support pointers to PROGMEM. Or when I have to create a string in a special format, for example when using the date or the time in a specific format.

I have mentioned the "P()" macro and the "F()" macro. They are not the same, but they do the same thing. It is a mistake by Arduino to create an extra "F()" while the "P()" already existed.
The "PROGMEM" is only for AVR microcontrollers (Arduino Uno, Arduino Mega 2560, Arduino Leonardo). The newer boards don't have PROGMEM, declaring a variable as 'const' is enough for those.