題名の通り、「長さ 0 の配列」を使うコードです。妙にアクロバティックなことをしていて、処理系によっては通りません。 「うまくいけば動く」、そんな一般性に欠けたコードですが、上手く応用すれば使えるような……気がします。
ちなみに、あの shi3z 大先生の昔のページからのパクりです。ひぃ(汗
コードは以下の通り。短いのでそのまま載せちゃいます。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct st{
int i;
char s[0]; /* 長さ0の配列 */
};
void main( void )
{
struct st *p;
char *str = "abcdefg";
int l;
l = strlen( str );
p = malloc( sizeof( int ) + sizeof( char ) * ( l + 1 ) );
strcpy( p->s, str );
putchar( p->s[3] );
}
何やってるか、判りますか ? 上手く通れば「 d 」が表示されるはずです。
「可変長文字列クラスのデータ部分だけ引っこ抜いた形」になるのかな。
実際に使用する場合は、アクセスは何らかの関数を介してする方が良いでしょう。
っていうか、そうでもしないと意味不明になってしまいます。
このコードは、"char *s;" で宣言すると、宣言時には s の指す先が不定だけど、 "char s[0];" で宣言すると、s の指す先はメンバ i の次の位置になる、 という性質を利用しています。
ちなみにこれを上手く使うと、文字列末尾の NULL 文字が要らなくなります。 でも、そうすると、文字列操作がいろいろ面倒臭くなるんだよなぁ……。
このコードが「上手く動かない」条件としては、
この3つ位ですか。VC++ では蹴られます。LSI C-86 では見事通りました。万歳。
C++ で使いたい場合は、配列の大きさを 1 にして同じようなことをやれば、 多分出来る……と、思います。