You should be making the array in PROGMEM (flash) instead of RAM and accessing through the special PROGMEM instructions.
I do this with my user-I/O menus and error messages even if I don't need just to stay in practice.
Examples ---
This just to show what HELPLINES and B (for byte) are:
#define HELPLINES 7
byte B;
Declaring a multi-line Program Usage message to be stored in flash and then a pointer into flash:
const char PROGMEM usageMsg[][80] = { // all this text stored in flash
" Piezo touch sensor tuner.",
"Adjust vertical; enter W to subtract or X to add, and a number 0-255",
"Adjust timescaler; enter A to subtract or D to add, and 0-16535",
"to add 250 to vertical enter W250 in Serial Monitor and press enter",
"seperate multiple commands with spaces; ex: W25 D240",
" ** this message stored in flash ram **",
" ** and printed with a 1 byte buffer ** :-P"
};
PGM_P Msg; // pointer into flash memory
First function prints a single line of text from flash. Second function prints multiple lines.
void printMsg( PGM_P FM )
{
do
{
B = pgm_read_byte( FM++ ); // pgm_read_byte( PGM_P ) is the only special access I use
if ( B ) Serial.print( B ); // but there are more to cover things like ints, etc.
}
while ( B );
}
void printHelp(void)
{
for ( byte i = 0; i < HELPLINES; i++ )
{
printMsg( usageMsg[ i ]);
Serial.println();
}
Serial.println();
}
PROGMEM doc page over at AVR_Libc -- the home of the C/C++ Arduino uses:
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html