Вопрос решается легко.
1. Ноль -- обозначает конец строки (хотя сам массив может быть гораздо длиннее).
2. В строке (буквально) хранить её длину первым числом -- неразумно.
Сделать примерно так:
## Код:
```
TYPE
    tString: REACORD
        len:INTEGER;
        str:ARRAY 100 OF CHAR;
    END;
VAR
    str : tString
BEGIN
........
```

И все проблемы решены. И с оптимизированным присвоением, и копированием, и конкатенацией, и чтением/записью.
Определяем тип в модуле без возможности расширения и получаем гарантированно работающий безопасный код)
Ноль в конце строки в данном случае совсем не нужен. Будет сохраняться как рудимент.

Во второй статье отличный анекдот про маляра Шлемиэля. Это про проблемы конкатенации в Си)) Не в бровь, а в глаз)) И инетерсные подробности работы  malloc. Это практически недоделанный сборщик мусора!!!)))