> (1)(3+$)."$[8]"
こちらの記述の場合のバッファのイメージは次のようになります。
(「@」はヌルです。文字列の最後の「"」はヌルに置き換えられます。)
(3+$)."@@@@@@@@@@
"12345678"+区切りのヌル1個
文字列は必ずダブルクォートで囲む必要があります。
それにより文字列の末尾がヌルとなって「文字列」として扱われます。
一方(2)(2+$).[8] の方のバッファのイメージは次のようになります。
(2+$).[8]@
123+区切りのヌル1個
つまり見かけ上の文字数しかバッファが確保されていません。
このように3バイトしか確保していなくても,実際に3バイトしか使わないので
あれば不具合は発生しません。しかし,8バイト確保したものと思い込んで
r..3のように7バイト目から2バイトの領域を指定して値の書き込みをすれば,
次の位置にあるマクロを壊してゆきます。致命的な不具合の発生する可能性が
非常に高くなります。暴走するかもしれません。
文字列として $[n] のように記述すると,nバイトのバッファが確保される
というのは記述上の約束です。書式に反した記述をすれば文法違反です。
"$[8]"は"12345678"のような文字列を簡潔に書けるというだけなのです。
文字を何も設定しなければ指定した数のヌルで埋めますが,設定もできます。
"$[8,'*']"のように設定すると,8個の「*」で埋めます。
また,この指定はバッファだけでなく,通常の文字列中にも埋められます。
例: &?("罫線$[20,'-']を引きます")