Ну смотри (сегмент данных):
str[1]="Это первое сообщение";
str[2]="Это второе";
str[3]="Это черт пойми какое";
void *ptr[]= 0, 20, 29; <-массив смещений от начала.
int length[] = 20, 9, 19; <-массив длин строк (не обязателен)
char* tempstr;
int strindex; <- переменная под индекс сообщения
tempstr = new char[1024]; <- выделение памяти под строку (длина - килобайт)
memcpy(tempstr, ptr[strindex], length[strindex]); <- копируем в tempstr нужную строку.
printf(tempstr);
...
в конце delete tempstr; <- освобождаем память.
Загружая кусок памяти с сообщениями + массив ссылок (и длин) получаешь то, что надо. Как работать с этим - придумаешь. Длины можно вычислять и без массива - численная разница текущего и следующего указателя. Заодно не надо стремиться к тому, чтобы сообщения на разных языках имели одинаковую длину.
Так организованы строки в С и С++. Не удивлюсь что и в других языках тоже (кроме С и Асма с другими мало знаком).
В С строка оканчивается символом 0x00. Можно сделать так же, тогда не надо длину вычислять. Почитай в инете. Функции strХХХ (strcpy, strlen, strcat и т.д.)